3109. [CQOI2013]新数独【DFS】

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
< > < > < >

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

比靶形数独那个题水多了= =……

 1 #include<iostream>
 2 #include<cstring>
 3 #include<cstdio>
 4 #define id(x,y) (x-1)*9+y
 5 using namespace std;
 6 int Relation[101][101],ans[12][12],maxn;
 7 int dx[4]= {0,0,-1},dy[4]= {0,-1,0};
 8 bool row[10][10],column[10][10],square[10][10][10],flag;
 9 char st[101];
10 
11 void Dfs(int x,int y)
12 {
13     maxn=max(x,maxn);
14     if (x==10 && y==1)
15     {
16         flag=true;
17         for (int i=1; i<=9; ++i)
18         {
19             for (int j=1; j<=8; ++j)
20                 printf("%d ",ans[i][j]);
21             printf("%d
",ans[i][9]);
22         }
23         return;
24     }
25     int down=1,up=9;
26     for (int i=1; i<=2; ++i)
27     {
28         int xx=x+dx[i],yy=y+dy[i];
29         if (xx<1 || xx>9 || yy<1 || yy>9 || ans[xx][yy]==0) continue;
30         if ( Relation[id(x,y)][id(xx,yy)] == 1 ) down=max(down,ans[xx][yy]+1);
31         if ( Relation[id(x,y)][id(xx,yy)] == 0 ) up=min(up,ans[xx][yy]-1);
32     }
33     for (int i=down; i<=up; ++i)
34         if (!row[x][i] && !column[y][i] && !square[(x-1)/3][(y-1)/3][i])
35         {
36             ans[x][y]=i;
37             row[x][i]=column[y][i]=square[(x-1)/3][(y-1)/3][i]=true;
38             if (y==9) Dfs(x+1,1);
39             else Dfs(x,y+1);
40             ans[x][y]=0;
41             row[x][i]=column[y][i]=square[(x-1)/3][(y-1)/3][i]=false;
42 
43             if (flag) return;
44         }
45 }
46 
47 int main()
48 {
49     memset(Relation,-1,sizeof(Relation));
50     for (int i=1; i<=15; ++i)
51         if (i%2==(1^(i>=6 && i<=10)))
52         {
53             for (int j=1; j<=3; ++j)
54                 for (int k=1; k<=2; ++k)
55                 {
56                     char opt=getchar();
57                     while (opt!='>' && opt!='<') opt=getchar();
58                     if (opt=='>')
59                     {
60                         Relation[(j-1)*3+k+(i/2+(i>10))*9][(j-1)*3+k+(i/2+(i>10))*9+1]=1;
61                         Relation[(j-1)*3+k+(i/2+(i>10))*9+1][(j-1)*3+k+(i/2+(i>10))*9]=0;
62                     }
63                     else
64                     {
65                         Relation[(j-1)*3+k+(i/2+(i>10))*9+1][(j-1)*3+k+(i/2+(i>10))*9]=1;
66                         Relation[(j-1)*3+k+(i/2+(i>10))*9][(j-1)*3+k+(i/2+(i>10))*9+1]=0;
67                     }
68                 }
69 
70         }
71         else
72         {
73             for (int j=1; j<=9; ++j)
74             {
75                 char opt=getchar();
76                 while (opt!='^' && opt!='v') opt=getchar();
77                 if (opt=='v')
78                 {
79                     Relation[id(i/2+(i>=5),j)][id(i/2+(i>=5)+1,j)]=1;
80                     Relation[id(i/2+(i>=5)+1,j)][id(i/2+(i>=5),j)]=0;
81                 }
82                 else
83                 {
84                     Relation[id(i/2+(i>=5)+1,j)][id(i/2+(i>=5),j)]=1;
85                     Relation[id(i/2+(i>=5),j)][id(i/2+(i>=5)+1,j)]=0;
86                 }
87             }
88         }
89     Dfs(1,1);
90 }
原文地址:https://www.cnblogs.com/refun/p/8682192.html