#include<iostream>
#include<cstdio>
#define searchnext(x,y) y==9? search(x+1,1):search(x,y+1)
using namespace std;
int ans[10][10];
int cpl[10][10],cpr[10][10];
bool usel[10][10],user[10][10],uses[10][10],flag;
void print()
{
for(int i=1;i<=9;i++)
{
for(int j=1;j<=9;j++)
{
printf("%d",ans[i][j]);
if(j!=9)printf(" ");
}
printf("\n");
}
}
int cmp(int x,int y){return x>y? 1:-1;}
bool pd(int x,int y,int k)
{
if(usel[x][k]||user[y][k])return 0;
if(uses[((x-1)/3)*3+(y-1)/3+1][k])return 0;
if(cmp(k,ans[x][y-1])!=cpl[x][y]&&cpl[x][y]!=0)return 0;
if(cmp(k,ans[x-1][y])!=cpr[x][y]&&cpr[x][y]!=0)return 0;
usel[x][k]=user[y][k]=uses[((x-1)/3)*3+(y-1)/3+1][k]=1;
return 1;
}
void search(int x,int y)
{
if(x==10)
{flag=1;print();return;}
if(flag)return;
for(int i=1;i<=9;i++)
{
if(pd(x,y,i))
{
ans[x][y]=i;
searchnext(x,y);
ans[x][y]=0;
usel[x][i]=user[y][i]=uses[((x-1)/3)*3+(y-1)/3+1][i]=0;
}
}
}
int main()
{
char ch[2];
for(int i=1;i<=9;i++)
{
for(int j=1;j<=9;j++)
{
if(j%3!=0)
{
scanf("%s",ch);
if(ch[0]=='>')cpl[i][j+1]=-1;
else cpl[i][j+1]=1;
}
}
if(i%3!=0)
for(int j=1;j<=9;j++)
{
scanf("%s",ch);
if(ch[0]=='v')cpr[i+1][j]=-1;
else cpr[i+1][j]=1;
}
}
search(1,1);
return 0;
}
3109: [cqoi2013]新数独 (回溯)
最新推荐文章于 2019-03-23 21:36:03 发布