数独(DFS)。
非常忧伤的一道题,先是剪枝的三个数组开成[9][9]导致 越界了WA。
然后就是每两组输出之间有空行,可是最后一组后面不能输出空行。PE好多次。
#include<cstdio>
#include<cstring>
#include<string>
#include<queue>
#include<algorithm>
#include<map>
#include<stack>
#include<iostream>
#include<list>
#include<set>
#include<cmath>
#define INF 0x7fffffff
#define eps 1e-8
#define LL long long
#define PI 3.141592654
#define CLR(a,b) memset(a,b,sizeof(a))
#define FORi(n) for(int i=0;i<n;i++)
#define FORj(n) for(int j=0;j<n;j++)
#define FORk(n) for(int k=0;k<n;k++)
#define debug puts("==fuck==")
#define acfun std::ios::sync_with_stdio(false)
#define SIZE 1000+10
using namespace std;
int g[9][9];
bool visx[9][10],visy[9][10],box[9][10];
void show()
{
FORi(9)
{
FORj(8)
printf("%d ",g[i][j]);
printf("%d\n",g[i][8]);
}
}
void dfs(int n)
{
if(n>80)
show();
else
{
int i=n/9,j=n%9;
if(!g[i][j])
{
for(int k=1; k<=9; k++)
if(!visx[i][k]&&!visy[j][k]&&!box[i/3*3+j/3][k])
{
g[i][j]=k;
visx[i][k]=visy[j][k]=box[i/3*3+j/3][k]=1;
dfs(n+1);
g[i][j]=0;
visx[i][k]=visy[j][k]=box[i/3*3+j/3][k]=0;
}
}
else
dfs(n+1);
}
}
int main()
{
char ch[5];
bool flag=0;
while(~scanf("%s",ch))
{
CLR(visx,0);
CLR(visy,0);
CLR(box,0);
if(ch[0]>='1'&&ch[0]<='9')
g[0][0]=ch[0]-'0';
else if(ch[0]=='?')
g[0][0]=0;
if(g[0][0])
visx[0][g[0][0]]=visy[0][g[0][0]]=box[0][g[0][0]]=1;
FORi(9)
FORj(9)
{
if(i==0&&j==0)continue;
scanf("%s",ch);
if(ch[0]>='1'&&ch[0]<='9')
g[i][j]=ch[0]-'0';
else if(ch[0]=='?')
g[i][j]=0;
if(g[i][j])
visx[i][g[i][j]]=visy[j][g[i][j]]=box[i/3*3+j/3][g[i][j]]=1;
}
if(!flag)flag=1;
else printf("\n");
dfs(0);
}
}