题意:在81宫格中填入1-9,使得每一行,每一列,每一大块(9个一块)都不相同
题解:使用深度优先搜索,可以使用row[9][10],col[9][10],block[9][10]来标记
还有个判断在第几块的套路,可以先在纸上比划,最后就得出规律了
#include<iostream>
#include<cstdio>
#include<vector>
#include<cstring>
using namespace std;
struct pos{
int r,c;
pos(){}
pos(int r,int c):r(r),c(c){}
};
vector<pos>blank;
int board[9][9],row[9][10],col[9][10],block[9][10];
int getblocknum(int r,int c)
{
int x=r/3;
int y=c/3;
return x*3+y;
}
void setflag(int r,int c,int num,int value)
{
row[r][num]=value;
col[c][num]=value;
block[getblocknum(r,c)][num]=value;
}
bool isok(int r,int c,int num)
{
return row[r][num]==0&&col[c][num]==0&&block[getblocknum(r,c)][num]==0;
}
bool dfs(int n)
{
if(n<0){
return true;
}
int x=blank[n].r;
int y=blank[n].c;
for(int i=1;i<=9;i++){
if(isok(x,y,i)){
board[x][y]=i;
setflag(x,y,i,1);
if(dfs(n-1)){
return true;
}
setflag(x,y,i,0);
}
}
return false;
}
int main()
{
int t;
scanf("%d",&t);
while(t--){
memset(row,0,sizeof(row));
memset(col,0,sizeof(col));
memset(block,0,sizeof(block));
blank.clear();
for(int i=0;i<9;i++){
for(int j=0;j<9;j++){
char c;
cin>>c;
board[i][j]=c-'0';
if(board[i][j]){
setflag(i,j,board[i][j],1);
}else{
blank.push_back(pos(i,j));
}
}
}
if(dfs(blank.size()-1)){
for(int i=0;i<9;i++){
for(int j=0;j<9;j++){
printf("%d",board[i][j]);
}
printf("\n");
}
}
}
return 0;
}