这几天做到好多爆搜题啊...

 

和靶形数独一样的套路,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 }