Sudoku Solver
Write a program to solve a Sudoku puzzle by filling the empty cells.
Empty cells are indicated by the character ‘.‘
.
You may assume that there will be only one unique solution.
A sudoku puzzle...
...and its solution numbers marked in red.
暴力深搜
class Solution { int map[10][10];//预先赋值的数组用来判断第i行第j列是第几个九宫格 bool r[10][10];//r[i][j]表示第i行是否已经有j了,如果有了就为true否则是false bool c[10][10];//c[i][j]表示第i列是否已经有j了,如果有了就为true否则是false bool s[10][10];//s[i][j]表示第i个九宫格中是否已经有j了,如果有了就为true否则是false(九宫格排序按从上到下从左到右) int counts, p[100], q[100];//counts记录的是一共有多少个格子没有填数字,p数组记录他们的行序号,q数组记录他们的列序号 //bool flag;//记录搜索的状态,如果找到答案了就为true,没找到为false public: void MakeMap() { for(int i = 1; i <= 9; i++) { for(int j = 1; j <= 9; j++) { if(i <= 3) { if(j <= 3) map[i][j] = 1; else if(j <= 6) map[i][j] = 2; else map[i][j] = 3; } else if(i <= 6) { if(j <= 3) map[i][j] = 4; else if(j <= 6) map[i][j] = 5; else map[i][j] = 6; } else { if(j <= 3) map[i][j] = 7; else if(j <= 6) map[i][j] = 8; else map[i][j] = 9; } } } } void initial(vector<vector<char>> &board){ counts=0; memset(r,false,sizeof(r)); memset(c,false,sizeof(c)); memset(s,false,sizeof(s)); for(int i = 1; i <= 9; i++) { for(int j = 1; j <= 9; j++) { if(board[i-1][j-1] != ‘.‘) { r[i][board[i-1][j-1]-‘0‘] = true; c[j][board[i-1][j-1]-‘0‘] = true; s[map[i][j]][board[i-1][j-1]-‘0‘] = true; } else//记录没有填数字的格子 { counts++; p[counts] = i; q[counts] = j; } } } } bool DFS(int cur,vector<vector<char>> &board) { if(cur == counts + 1) { return true; } for(int i = 1; i <= 9; i++)//p[cur]表示未填数字的格子的行序号,q[cur]表示未填数字的格子的列序号 { if(r[p[cur]][i] == false && c[q[cur]][i] == false && s[map[p[cur]][q[cur]]][i] == false) { board[p[cur]-1][q[cur]-1] = i + ‘0‘; r[p[cur]][i] = true; c[q[cur]][i] = true; s[map[p[cur]][q[cur]]][i] = true; if(DFS(cur + 1 , board))return true; //board[p[cur]-1][q[cur]-1] = ‘.‘; r[p[cur]][i] = false; c[q[cur]][i] = false; s[map[p[cur]][q[cur]]][i] = false; } } } void solveSudoku(vector<vector<char> > &board) { MakeMap();//map矩阵的初始化 initial(board);//初始化操作 DFS(1,board); } };