这是一道神奇的搜索题吗,但是与八皇后问题的记录行列的那种方法类似,不过还要记录9 * 9的小方格。之后就好解了(大嘘)。
#include <iostream> #include <cstdio> #include <algorithm> #include <cstring> using namespace std; int sudoku[15][15] = { {0} }; bool row[15][15] = { {0} }, cln[15][15] = { {0} }, grid[15][15] = { {0} }; void put() { for (int i = 0; i < 9; i++) { for (int j = 0; j < 9; j++) { cout << sudoku[i][j] ; } cout << endl; } } bool done = 0; void dfs(const int x,const int y) { if (done) return ; if (x >= 9) { put(); done = true; return ; } if (sudoku[x][y]) dfs(x + y/8,(y + 1) % 9); else { for (int i = 1; i <= 9; i++) { if (!row[x][i] && !cln[y][i] && !grid[x/3 * 3 + y/3][i]) { //cout << i << endl;cout << x << " " << y << endl; row[x ][i] = cln[y ][i] = grid[x / 3 * 3 + y / 3][i] = true; sudoku[x][y] = i; dfs(x + y / 8,(y + 1) % 9); sudoku[x][y] = 0; row[x ][i] = cln[y ][i] = grid[x / 3 * 3 + y / 3][i] = false; } } } return ; } int main() { int t; cin >> t; while (t--) { done = 0; memset(row, 0, sizeof(row)); memset(cln, 0, sizeof(cln)); memset(grid, 0, sizeof(grid)); for (int i = 0; i < 9; i++) { for (int j = 0; j < 9; j++) { //cout << i << " " << j << endl; scanf("%1d",&sudoku[i][j]); if (sudoku[i][j]) { row[i][sudoku[i][j]] = true; cln[j][sudoku[i][j]] = true; grid[i / 3 * 3 + j / 3][sudoku[i][j]] = true; } } } dfs(0, 0); } return 0; }
最后要说的一点是i / 3 * 3 + j / 3 或 x / 3 * 3 + y / 3的含义,记录第几个小方格放了1~9的那几个数。
最后,找到答案就全力返回,找到的一定就是答案。
原文:https://www.cnblogs.com/cuizhihui/p/10920042.html