[cqoi2013]新数独
[cqoi2013]新数独
题目
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
< > < > < >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
解题报告
裸搜
记录一下各点之间的大小关系,记录一下各点的出度入度来确定枚举范围(这里的出度入度指有几个数比他大,几个数比他小)
搜就可以了
1 #include<iostream> 2 #include<cstring> 3 #include<cstdio> 4 #include<cstdlib> 5 using namespace std; 6 inline char read(){ 7 char ch(getchar()); 8 while(ch!='<'&&ch!='>'&&ch!='v'&&ch!='^') 9 ch=getchar(); 10 return ch; 11 } 12 bool h[10][10],l[10][10],jgg[10][10]; 13 int dx[10][10][10][10]; 14 int indegree[10][10],outdegree[10][10]; 15 inline void insert(int a,int b,int c,int d){ 16 ++indegree[c][d]; 17 ++outdegree[a][b]; 18 dx[a][b][c][d]=1; 19 dx[c][d][a][b]=-1; 20 } 21 int ans[10][10]; 22 bool vis[10][10]; 23 inline bool judge(int x,int y,int zhi){ 24 if(x!=1&&vis[x-1][y]&&dx[x][y][x-1][y]!=0){ 25 if(dx[x][y][x-1][y]==1&&zhi>=ans[x-1][y]) 26 return false; 27 if(dx[x][y][x-1][y]==-1&&zhi<=ans[x-1][y]) 28 return false; 29 } 30 if(x!=9&&vis[x+1][y]&&dx[x][y][x+1][y]!=0){ 31 if(dx[x][y][x+1][y]==1&&zhi>=ans[x+1][y]) 32 return false; 33 if(dx[x][y][x+1][y]==-1&&zhi<=ans[x+1][y]) 34 return false; 35 } 36 if(y!=1&&vis[x][y-1]&&dx[x][y][x][y-1]!=0){ 37 if(dx[x][y][x][y-1]==1&&zhi>=ans[x][y-1]) 38 return false; 39 if(dx[x][y][x][y-1]==-1&&zhi<=ans[x][y-1]) 40 return false; 41 } 42 if(y!=9&&vis[x][y+1]&&dx[x][y][x][y+1]!=0){ 43 if(dx[x][y][x][y+1]==1&&zhi>=ans[x][y+1]) 44 return false; 45 if(dx[x][y][x][y+1]==-1&&zhi<=ans[x][y+1]) 46 return false; 47 } 48 return true; 49 } 50 inline void print(){ 51 for(int i=1;i<=9;++i){ 52 for(int j=1;j<9;++j) 53 printf("%d ",ans[i][j]); 54 printf("%d\n",ans[i][9]); 55 } 56 } 57 int bl[10][10]; 58 inline void dfs(int x,int y){ 59 vis[x][y]=1; 60 for(int i=indegree[x][y]+1;i<=9-outdegree[x][y];++i) 61 if(!h[x][i]&&!l[y][i]&&!jgg[bl[x][y]][i]&&judge(x,y,i)){ 62 h[x][i]=l[y][i]=jgg[bl[x][y]][i]=1; 63 ans[x][y]=i; 64 if(x==9&&y==9){ 65 print(); 66 exit(0); 67 } 68 if(y==9) 69 dfs(x+1,1); 70 else 71 dfs(x,y+1); 72 h[x][i]=l[y][i]=jgg[bl[x][y]][i]=0; 73 } 74 vis[x][y]=0; 75 } 76 int main(){ 77 for(int i=1,cnt=0;i<=9;++i) 78 for(int j=1;j<=9;++j) 79 bl[i][j]=((i-1)/3)*3+(j-1)/3+1; 80 for(int i=1;i<=15;++i){ 81 int pos1,pos2; 82 if(i==1||i==3||i==5||i==6||i==8||i==10||i==11||i==13||i==15){ 83 if(i==1)pos1=1; 84 if(i==3)pos1=2; 85 if(i==5)pos1=3; 86 if(i==6)pos1=4; 87 if(i==8)pos1=5; 88 if(i==10)pos1=6; 89 if(i==11)pos1=7; 90 if(i==13)pos1=8; 91 if(i==15)pos1=9; 92 for(int j=1;j<=6;++j){ 93 if(j==1)pos2=1; 94 if(j==2)pos2=2; 95 if(j==3)pos2=4; 96 if(j==4)pos2=5; 97 if(j==5)pos2=7; 98 if(j==6)pos2=8; 99 char tp(read()); 100 if(tp=='<') 101 insert(pos1,pos2,pos1,pos2+1); 102 else 103 insert(pos1,pos2+1,pos1,pos2); 104 } 105 } 106 else{ 107 if(i==2)pos1=1; 108 if(i==4)pos1=2; 109 if(i==7)pos1=4; 110 if(i==9)pos1=5; 111 if(i==12)pos1=7; 112 if(i==14)pos1=8; 113 for(int j=1;j<=9;++j){ 114 pos2=j; 115 char tp(read()); 116 if(tp=='^') 117 insert(pos1,pos2,pos1+1,pos2); 118 else 119 insert(pos1+1,pos2,pos1,pos2); 120 } 121 } 122 } 123 dfs(1,1); 124 }