就是给你一个9*9 的方格,一些位置给出了具体数字,让你填写其他的,然后使得每一行每一列以及 9个3*3 小方格都是1-9组成;
思路应该就是深搜一个一个的试。。。最后看discuss的时候,发现倒着搜比正着要快好多。可能是数据问题?
代买:
/*
正着搜索,时间比倒着要慢好多好多
正:
Accepted 1851 C++ 0.9K 0'01.14" 1352K
倒:
Accepted 1851 C++ 0.9K 0'00.01" 1352K
*/
#include <iostream>
using namespace std;
char s[10][10];//sudoku
bool check(int x,int y,char c)
{//检验把c放在[x][y] 是否合理
for(int i=0;i<9;i++)
if(s[x][i]==c) return false;//检验行
for(int i=0;i<9;i++)
if(s[i][y]==c) return false;//检验列
int xx=x/3*3,yy=y/3*3;
for(int i=0;i<3;i++)//检验3*3小方块
for(int j=0;j<3;j++)
if(s[xx+i][yy+j]==c) return false;
return true;
}
bool dfs(int k)//二维压缩为1维 ,9*9 变成0-80然后再切换回二维
{//深搜处理
int x=k/9,y=k%9;
if(k==-1)
{
return true;
}
if(s[x][y]!='0') return dfs(k-1);//已有不用处理
for(int i=1;i<=9;i++)
{
char c='0'+i;
if(check(x,y,c))
{
s[x][y]=c;
if(dfs(k-1)) return true;
s[x][y]='0';//失败继续循环
}
}
return false;//都不合理,返回false
}
int main()
{
int T;
cin>>T;
while(T--)
{
for(int i=0;i<9;i++)
cin>>s[i];
dfs(80);
for(int i=0;i<9;i++)
cout<<s[i]<<endl;
}
}