#include using namespace std;#define N 10char m;int n;int matrix[][N]={//为了处理方便,将0行0列忽略 {0,0,0,0,0,0,0,0,0,0}, {0,8,0,0,0,0,0,0,0,0}, {0,0,0,3,6,0,0,0,0,0}, {0,0,7,0,0,9,0,2,0,0}, {0,0,5,0,0,0,7,0,0,0}, {0,0,0,0,0,4,5,7,0,0}, {0,0,0,0,1,0,0,0,3,0}, {0,0,0,1,0,0,0,0,6,8}, {0,0,0,8,5,0,0,0,1,0}, {0,0,9,0,0,0,0,4,0,0}};const int board[N][N]={//判断第i行第j列是第几个九宫格 {0,0,0,0,0,0,0,0,0,0}, {0,1,1,1,2,2,2,3,3,3}, {0,1,1,1,2,2,2,3,3,3}, {0,1,1,1,2,2,2,3,3,3}, {0,4,4,4,5,5,5,6,6,6}, {0,4,4,4,5,5,5,6,6,6}, {0,4,4,4,5,5,5,6,6,6}, {0,7,7,7,8,8,8,9,9,9}, {0,7,7,7,8,8,8,9,9,9}, {0,7,7,7,8,8,8,9,9,9}};bool r[N][N];//r[i][j]表示第i行是否已经有j了bool c[N][N];//c[i][j]表示第i列是否已经有j了bool s[N][N];//s[i][j]表示第i个九宫格中是否已经有j了int counts, p[N*N], q[N*N];//counts记录的是一共有多少个格子没有填数字, //p数组记录他们的行序号,q数组记录他们的列序号void Initial();void DFS(int cur);void Print();int main(){ Initial();//初始化 DFS(1); return 0;}void Initial(){ counts = 0; memset(r,false,sizeof(r)); memset(c,false,sizeof(r)); memset(s,false,sizeof(r)); for(int i = 1; i <= 9; i++) { for(int j = 1; j <= 9; j++) { if(matrix[i][j] != 0) { r[i][matrix[i][j]] = true; c[j][matrix[i][j]] = true; s[board[i][j]][matrix[i][j]] = true; } else//记录没有填数字的格子 { counts++; p[counts] = i; q[counts] = j; } } }}void DFS(int cur){ if(cur == counts + 1) { Print(); return ; } for(int i = 1; i <= 9; i++)//p[cur]表示未填数字的格子的行序号,q[cur]表示未填数字的格子的列序号 { if(r[p[cur]][i] == false && c[q[cur]][i] == false && s[board[p[cur]][q[cur]]][i] == false) { matrix[p[cur]][q[cur]] = i; r[p[cur]][i] = true; c[q[cur]][i] = true; s[board[p[cur]][q[cur]]][i] = true; DFS(cur + 1); r[p[cur]][i] = false; c[q[cur]][i] = false; s[board[p[cur]][q[cur]]][i] = false; } }}void Print(){ for(int i = 1; i <= 9; i++) { for(int j = 1; j <= 9; j++) cout << matrix[i][j]; cout << endl; }} |