如图,玩家需要根据9×9盘面上的已知数字,推理出所有剩余空格的数字,并满足每一行、每一列、每一个同色九宫内的数字均含1-9,不重复。
格式要求:
输入9行,每行9个数字,0代表未知,其它数字为已知。
输出9行,每行9个数字表示数独的解。
例如:
输入:
005300000
800000020
070010500
400005300
010070006
003200080
060500009
004000030
000009700
输出:
145327698
839654127
672918543
496185372
218473956
753296481
367542819
984761235
521839764
思路:对大九宫格进行填数,每个格子里的数必须满足所在列无重复,所在行无重复,所在小九宫格无重复
#include<iostream>
using namespace std;
int map[9][9];
bool check(int x,int y,int k){
for(int i = 0; i < 9; i++){//检查(x,y)所在行和列必须都不能与k重复
if(map[x][i] == k) return false;
if(map[i][y] == k) return false;
}
for(int i = (x/3)*3; i < (x/3+1)*3; i++){//检查(x,y)所在小九宫格
for(int j = (y/3)*3; j < (y/3+1)*3; j++){
if(map[i][j] == k){
return false;
}
}
}
return true;
}
void dfs(int x, int y){
if(x == 9){
for(int i = 0; i < 9; i++){
for(int j = 0; j < 9; j++){
cout << map[i][j];
}
cout << endl;
}
exit(0);//九宫格的解法只有一种,输出后直接exit
}
if(map[x][y] == 0){
for(int i = 1; i < 10; i++){
if(check(x, y, i)){//如果(x,y)格子可以填入数字i
map[x][y] = i;
dfs(x + (y + 1)/9, (y + 1)%9);
}
}
//没有合适的值,回到上一个格子继续换值试探
map[x][y] = 0; //如果上一个格子也没有值使这个格子有合适的值,回溯,令上一层的map[x][y] = 0;
}else{
dfs(x + (y + 1)/9, (y + 1)%9);
}
}
int main(){
for(int i = 0; i < 9; i++){
for(int j = 0; j < 9; j++){
cin >> map[i][j];
}
}
dfs(0,0);
return 0;
}