题目描述
给出一个的表格,部分格子已经填好数。请填完所有空白格子,使得表格每一行、每一列、每个的九宫格,都恰好填满这9个数字。
输入格式
9行9列的方阵状态,0代表空格。
输出格式
输出完成后的方阵状态,每一个小九宫格以空格分隔。行为三个空格,列为一个空格。
样例
样例输入:
复制0 6 0 1 0 4 0 5 0
0 0 8 3 0 5 6 0 0
2 0 0 0 0 0 0 0 1
8 0 0 4 0 7 0 0 6
0 0 6 0 0 0 3 0 0
7 0 0 9 0 1 0 0 4
5 0 0 0 0 0 0 0 2
0 0 7 2 0 6 9 0 0
0 4 0 5 0 8 0 7 0
输出样例:
复制9 6 3 1 7 4 2 5 8
1 7 8 3 2 5 6 4 9
2 5 4 6 8 9 7 3 18 2 1 4 3 7 5 9 6
4 9 6 8 5 2 3 1 7
7 3 5 9 6 1 8 2 4 5 8 9 7 1 3 4 6 2
3 1 7 2 4 6 9 8 5
6 4 2 5 9 8 1 7 3
_____________________________________________________________________________
写作不易,点个赞呗!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
_____________________________________________________________________________
#include<bits/stdc++.h>
using namespace std;
int a[10][10];
bool b[10][10];
bool c[10][10];
bool d[4][4][10];
void f(int x,int y){if(x==10&&y==1){for(int i=1;i<=9;i++){for(int j=1;j<=9;j++){cout<<a[i][j]<<" ";if(j%3==0)cout<<" ";}if(i%3==0)cout<<endl<<endl;cout<<endl;}exit(0);}if(a[x][y]==0){for(int i=1;i<=9;i++){if(b[x][i]==true||c[y][i]==true||d[(x+2)/3][(y+2)/3][i]==true)continue;a[x][y]=i;b[x][i]=c[y][i]=d[(x+2)/3][(y+2)/3][i]=true;if(y+1<10)f(x,y+1);if(y==9&&x+1<=10)f(x+1,1); b[x][i]=c[y][i]=d[(x+2)/3][(y+2)/3][i]=false;a[x][y]=0;}}else{if(y+1>0&&y+1<10)f(x,y+1);if(y==9&&x+1>0&&x+1<=10)f(x+1,1);}
}
int main(){for(int i=1;i<=9;i++){for(int j=1;j<=9;j++){cin>>a[i][j];if(a[i][j]!=0)b[i][a[i][j]]=c[j][a[i][j]]=d[(i+2)/3][(j+2)/3][a[i][j]]=true;}}f(1,1);
}