Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <iostream>
- #include <stdio.h>
- #include <fstream>
- #include <string>
- #include "Sudoku.h"
- using namespace std;
- node::node()
- {
- x = -1;
- y = -1;
- next = NULL;
- prev = NULL;
- val = NULL;
- for (int i = 0; i < 9; i++)
- arrint[i] = 0;
- }
- node::~node(){}
- Sudoku::Sudoku() { head = NULL; tail = NULL; }
- Sudoku::~Sudoku() {}
- void Sudoku::read_File(char TowD[9][9]) {
- ifstream inFile;
- inFile.open("TextFile2.txt");
- if (!inFile)
- cout << "error opening the file";
- else {
- char x[100];
- inFile >> x;
- int ind = 0;
- for (int i = 0; i < 9; i++)
- for (int j = 0; j < 9; j++) {
- TowD[i][j] = x[ind];
- ind++;
- }
- }
- }
- //Read File----------------------------------------------------------------------------------------------------------------------------
- void Sudoku::search(int x, int y, char TowD[9][9], char arr[9]) {
- int t = 0;
- if (x >= 0 && x <= 2 && y >= 0 && y <= 2) { // box 1
- for (int i = 0; i <= 2; i++) {
- for (int j = 0; j <= 2; j++) {
- if (TowD[i][j] != '0') {
- arr[t] = TowD[i][j];
- t++;
- }
- }
- }
- }
- else if (x >= 0 && x <= 2 && y >= 3 && y <= 5) { // box 2
- for (int i = 0; i <= 2; i++) {
- for (int j = 3; j <= 5; j++) {
- if (TowD[i][j] != '0') {
- arr[t] = TowD[i][j];
- t++;
- }
- }
- }
- }
- else if (x >= 0 && x <= 2 && y >= 6 && y <= 8) { // box 3
- for (int i = 0; i <= 2; i++) {
- for (int j = 6; j <= 8; j++) {
- if (TowD[i][j] != '0') {
- arr[t] = TowD[i][j];
- t++;
- }
- }
- }
- }
- else if (x >= 3 && x <= 5 && y >= 0 && y <= 2) { // box 4
- for (int i = 3; i <= 5; i++) {
- for (int j = 0; j <= 2; j++) {
- if (TowD[i][j] != '0') {
- arr[t] = TowD[i][j];
- t++;
- }
- }
- }
- }
- else if (x >= 3 && x <= 5 && y >= 3 && y <= 5) { // box 5
- for (int i = 3; i <= 5; i++) {
- for (int j = 3; j <= 5; j++) {
- if (TowD[i][j] != '0') {
- arr[t] = TowD[i][j];
- t++;
- }
- }
- }
- }
- else if (x >= 3 && x <= 5 && y >= 6 && y <= 8) { // box 6
- for (int i = 3; i <= 5; i++) {
- for (int j = 6; j <= 8; j++) {
- if (TowD[i][j] != '0') {
- arr[t] = TowD[i][j];
- t++;
- }
- }
- }
- }
- else if (x >= 6 && x <= 8 && y >= 0 && y <= 2) { // box 7
- for (int i = 6; i <= 8; i++) {
- for (int j = 0; j <= 2; j++) {
- if (TowD[i][j] != '0') {
- arr[t] = TowD[i][j];
- t++;
- }
- }
- }
- }
- else if (x >= 6 && x <= 8 && y >= 3 && y <= 5) { // box 8
- for (int i = 6; i <= 8; i++) {
- for (int j = 3; j <= 5; j++) {
- if (TowD[i][j] != '0') {
- arr[t] = TowD[i][j];
- t++;
- }
- }
- }
- }
- else if (x >= 6 && x <= 8 && y >= 6 && y <= 8) { // box 9
- for (int i = 6; i <= 8; i++) {
- for (int j = 6; j <= 8; j++) {
- if (TowD[i][j] != '0') {
- arr[t] = TowD[i][j];
- t++;
- }
- }
- }
- }
- bool test = false;
- for (int i = 0; i < 9; i++) {
- if (TowD[i][y] != '0') {
- for (int j = 0; j < t; j++) {
- if (TowD[i][y] != arr[j]) {
- test = true;
- }
- }
- if (test == false)
- arr[t] = TowD[i][y];
- t++;
- }
- }
- for (int j = 0; j < 9; j++) {
- if (TowD[x][j] != '0') {
- for (int i = 0; i < t; i++) {
- if (TowD[x][i] != arr[j]) {
- test = true;
- }
- }
- if (test == false)
- arr[t] = TowD[x][j];
- t++;
- }
- }
- }
- //Search-------------------------------------------------------------------------------------------------------------------------------
- void Sudoku::Store(int i, int j, char TowD[9][9],char chance[9]) {
- char arr[9] = {'0'};
- search(i, j, TowD,arr);
- char temp = '1';
- bool test = false;
- int index = 0;
- for (int i = 0; i < 9; i++) {
- for (int t = 0; t < 9; t++)
- if(temp==arr[t])test=true;
- if (test == false) {
- chance[index]=temp;
- index++;
- }
- temp++;
- }
- }
- //Store Available Number---------------------------------------------------------------------------------------------------------------
- void Sudoku::addNode(char towd[9][9],int i,int j,char chance[9]) {
- if (head == NULL) {
- node* new_node = new node;
- new_node->prev = head;
- head = new_node;
- tail = new_node;
- new_node->x = i;
- new_node->y = j;
- for (int i = 0; i < 9; i++)
- new_node->arrint[i] = chance[i];
- new_node->val = &new_node->arrint[0];
- towd[i][j] = *(new_node->val);
- }
- else {
- node* new_node = new node;
- for (int i = 0; i < 9; i++)
- new_node->arrint[i] = chance[i];
- new_node->val = &new_node->arrint[0];
- new_node->x = i;
- new_node->y = j;
- new_node->prev = tail;
- tail->next = new_node;
- tail = new_node;
- towd[i][j] = * (new_node->val);
- }
- }
- void Sudoku::backTrack(char towd[9][9],int i, int j) {
- node* P;
- P = tail;
- delete tail;
- P = P->prev;
- }
- void Sudoku::solve(char towd[9][9]) {
- char chance[9] = { '0' };
- for (int i = 0; i < 9; i++) {
- for (int j = 0; j < 9; j++) {
- if (towd[i][j] == '0') {
- Store(i, j, towd, chance);
- if (chance[0] == '0')
- backTrack(towd,i,j);
- else {
- addNode(towd, i, j, chance);
- }
- }
- }
- }
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement