bzoj3109 [cqoi2013]新数独
Description
Input
输入一共15行,包含一个新数独的实例。第奇数行包含左右方向的符号(<和>),第偶数行包含上下方向的符号(^和v)。
Output
输出包含9行,每行9个1~9的数字,以单个空格隔开。输入保证解惟一。
Sample Input
< > > < > <
v v ^ ^ v v ^ ^ ^
< < > < > <
^ ^ ^ v ^ ^ ^ v v
< < < < > >
> < > > > >
v ^ ^ ^ ^ v v v ^
> > > > < >
v v ^ v ^ v ^ v ^
> < < > > >
< < < < > <
v ^ v v v v ^ ^ v
< > > < < >
^ v v v ^ v ^ v v
< > < > < >
v v ^ ^ v v ^ ^ ^
< < > < > <
^ ^ ^ v ^ ^ ^ v v
< < < < > >
> < > > > >
v ^ ^ ^ ^ v v v ^
> > > > < >
v v ^ v ^ v ^ v ^
> < < > > >
< < < < > <
v ^ v v v v ^ ^ v
< > > < < >
^ v v v ^ v ^ v v
< > < > < >
Sample Output
4 9 1 7 3 6 5 2 8
2 3 7 8 1 5 6 4 9
5 6 8 2 4 9 7 3 1
9 1 3 6 5 4 8 7 2
8 5 4 9 7 2 1 6 3
7 2 6 3 8 1 9 5 4
3 4 9 5 6 8 2 1 7
1 8 5 4 2 7 3 9 6
6 7 2 1 9 3 4 8 5
题解
搜索裸题。。当做是锻炼代码能力吧。。。
注意输出格式
代码
#include <cstdio> #include <cstring> using namespace std; int i,j,k,n,m,x,y,t,a[10][10],b[10][10],ans[10][10]; bool b1[10][10],b2[10][10],b3[10][10],b4[10],flag=false; char s[20]; int calc(int x,int y){return (((x-1)/3+1)-1)*3+((y-1)/3+1);} int min(int x,int y){return x<y?x:y;} int max(int x,int y){return x>y?x:y;} void dfs(int mn,int mx,int x,int y){ if (x==10){flag=true;return;} for (int i=mn;i<=mx;i++)if (!b1[i][x]&&!b2[i][y]&&!b3[i][calc(x,y)]){ b1[i][x]=1;b2[i][y]=1;b3[i][calc(x,y)]=1;ans[x][y]=i; if (y==9){ if (b[x+1][1]==0)dfs(1,9,x+1,1); else if (b[x+1][1]==1)dfs(1,ans[x][1],x+1,1); else if (b[x+1][1]==2)dfs(ans[x][1],9,x+1,1); if (flag)return; } else{ if (b[x][y+1]==0){ if (a[x][y+1]==0)dfs(1,9,x,y+1); else if (a[x][y+1]==1)dfs(1,ans[x][y],x,y+1); else if (a[x][y+1]==2)dfs(ans[x][y],9,x,y+1); } else if (b[x][y+1]==1){ if (a[x][y+1]==0)dfs(1,ans[x-1][y+1],x,y+1); else if (a[x][y+1]==1)dfs(1,min(ans[x][y],ans[x-1][y+1]),x,y+1); else if (a[x][y+1]==2)dfs(ans[x][y],ans[x-1][y+1],x,y+1); } else if (b[x][y+1]==2){ if (a[x][y+1]==0)dfs(ans[x-1][y+1],9,x,y+1); else if (a[x][y+1]==1)dfs(ans[x-1][y+1],ans[x][y],x,y+1); else if (a[x][y+1]==2)dfs(max(ans[x-1][y+1],ans[x][y]),9,x,y+1); } if (flag)return; } b1[i][x]=0;b2[i][y]=0;b3[i][calc(x,y)]=0; } return; } int main(){ for (i=1;i<=15;i++){ if (((i-1)%5+1)&1){ x++;y=0;gets(s); for (k=0;k<strlen(s);k++) if (s[k]=='>'){y++;if (y==1)a[x][2]=1;else if (y==2)a[x][3]=1;else if (y==3)a[x][5]=1;else if(y==4)a[x][6]=1;else if (y==5)a[x][8]=1;else if (y==6)a[x][9]=1;} else if(s[k]=='<'){y++;if (y==1)a[x][2]=2;else if (y==2)a[x][3]=2;else if (y==3)a[x][5]=2;else if(y==4)a[x][6]=2;else if (y==5)a[x][8]=2;else if (y==6)a[x][9]=2;} } else{y=0;gets(s);for (k=0;k<strlen(s);k++)if (s[k]=='v')b[x+1][++y]=1;else if (s[k]=='^')b[x+1][++y]=2;} if (i!=15)scanf("\n"); } dfs(1,9,1,1); for (i=1;i<=9;i++){for (j=1;j<=8;j++)printf("%d ",ans[i][j]);printf("%d\n",ans[i][9]);} return 0; }