[BZOJ3109] [cqoi2013]新数独
这几天做到好多爆搜题啊...
和靶形数独一样的套路,bh[i][z],bl[i][z],num[i][z]数组判断该行/列/3*3方格是否填过z这个数
然而因为for循环没学好(找规律太烦),输入就一行一行读了
代码:
1 #include<cstdio> 2 #include<queue> 3 #include<iostream> 4 #include<cstring> 5 using namespace std; 6 inline int read(){ 7 int ans=0,f=1;char chr=getchar(); 8 while(!isdigit(chr)){if(chr=='-') f=-1;chr=getchar();} 9 while(isdigit(chr)){ans=(ans<<3)+(ans<<1)+chr-48;chr=getchar();} 10 return ans*f; 11 }char h[20][20],l[20][20];int num[15][15],bh[15][15],bl[15][15]; 12 inline int get(int x,int y){ 13 if(x<=3&&y<=3) return 1; 14 if(x<=6&&y<=3) return 2; 15 if(x>6&&y<=3) return 3; 16 if(x<=3&&y<=6) return 4; 17 if(x<=6&&y<=6) return 5; 18 if(y<=6) return 6; 19 if(x<=3) return 7; 20 if(x<=6) return 8; 21 return 9; 22 }int ANS[10][10]; 23 inline int check(int x,int y,int z){if(bh[x][z]||bl[y][z]||num[get(x,y)][z]) return 0;return 1;} 24 inline void init(int x,int y,int z) {num[get(x,y)][z]=bh[x][z]=bl[y][z]=1;} 25 inline void outit(int x,int y,int z){num[get(x,y)][z]=bh[x][z]=bl[y][z]=0;} 26 inline int check_lr(int x,int y,int z){ 27 if(y%3==1)return 1; 28 if(h[x][y-1]=='<') return ANS[x][y-1]<z; 29 else return ANS[x][y-1]>z; 30 }inline int check_ud(int x,int y,int z){ 31 if(x%3==1)return 1; 32 if(l[x-1][y]=='v') return ANS[x-1][y]>z; 33 else return ANS[x-1][y]<z; 34 }inline void OUTPUT(){for(int i=1;i<=9;i++,puts(""))for(int j=1;j<=9;j++) printf("%d ",ANS[i][j]);} 35 void dfs(int x,int y){ 36 if(x==10){OUTPUT();exit(0);} 37 if(y==10){dfs(x+1,1);return;} 38 for(int i=1;i<=9;i++) 39 if(check(x,y,i)&&check_lr(x,y,i)&&check_ud(x,y,i)) 40 ANS[x][y]=i,init(x,y,i),dfs(x,y+1),outit(x,y,i); 41 }int main(){ 42 for(int i=1;i<=9;i++) {if(i%3==0) continue;cin>>h[1][i];} 43 for(int i=1;i<=9;i++) cin>>l[1][i]; 44 for(int i=1;i<=9;i++) {if(i%3==0) continue;cin>>h[2][i];} 45 for(int i=1;i<=9;i++) cin>>l[2][i]; 46 for(int i=1;i<=9;i++) {if(i%3==0) continue;cin>>h[3][i];} 47 for(int i=1;i<=9;i++) {if(i%3==0) continue;cin>>h[4][i];} 48 for(int i=1;i<=9;i++) cin>>l[4][i]; 49 for(int i=1;i<=9;i++) {if(i%3==0) continue;cin>>h[5][i];} 50 for(int i=1;i<=9;i++) cin>>l[5][i]; 51 for(int i=1;i<=9;i++) {if(i%3==0) continue;cin>>h[6][i];} 52 for(int i=1;i<=9;i++) {if(i%3==0) continue;cin>>h[7][i];} 53 for(int i=1;i<=9;i++) cin>>l[7][i]; 54 for(int i=1;i<=9;i++) {if(i%3==0) continue;cin>>h[8][i];} 55 for(int i=1;i<=9;i++) cin>>l[8][i]; 56 for(int i=1;i<=9;i++) {if(i%3==0) continue;cin>>h[9][i];} 57 dfs(1,1); 58 return 0; 59 }