您的位置:首页 > 其它

bzoj 3109: [cqoi2013]新数独

2016-03-22 23:04 459 查看
#include<cstdio>
#include<iostream>
using namespace std;
int ha[10][10],li[10][10],xi[10][10],a[10][10],bh[10][10],bl[10][10],kg;
char ch[5];
bool pan(int x,int y,int i)
{
if(ha[x][i]||li[y][i]||xi[(x-1)/3*3+(y-1)/3][i])
return 0;
if((y-1)%3!=0&&(bh[x][y]^(i>a[x][y-1])))
return 0;
if((x-1)%3!=0&&(bl[x][y]^(i>a[x-1][y])))
return 0;
return 1;
}
void dfs(int x,int y)
{
//if(a[1][1]==4&&a[1][2]==9&&a[1][3]==1&&a[1][4]==7&&a[1][5]==3&&a[1][6]==6&&a[1][7]==5&&a[1][8]==2)
//{
//printf(" ");
//}
if(kg)
return;
if(y==10)
{
x++;
y=1;
}
if(x==10)
{
kg=1;
for(int i=1;i<=9;i++)
{
for(int j=1;j<=9;j++)
{
printf("%d",a[i][j]);
if(j!=9)
printf(" ");
}
printf("\n");
}
return;
}
for(int i=1;i<=9;i++)
if(pan(x,y,i))
{
a[x][y]=i;
ha[x][i]=1;
li[y][i]=1;
xi[(x-1)/3*3+(y-1)/3][i]=1;
dfs(x,y+1);
ha[x][i]=0;
li[y][i]=0;
xi[(x-1)/3*3+(y-1)/3][i]=0;
}
}
int main()
{
for(int i=1;i<=9;i++)
{
for(int j=1;j<9;j++)
if(j%3)
{
scanf("%s",ch);
if(ch[0]=='<')
bh[i][j+1]=1;
else
bh[i][j+1]=0;
}
if(i%3)
for(int j=1;j<=9;j++)
{
scanf("%s",ch);
if(ch[0]=='^')
bl[i+1][j]=1;
else
bl[i+1][j]=0;
}
}
dfs(1,1);
return 0;
}


一个非常恶心的搜索。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: