简单搜索题目~

View Code
1 #include <iostream>
2 #define SIZE 64
3 usingnamespace std;
4 constint dx[] = {-1,0,1,0};
5 constint dy[] = {0,1,0,-1};
6 constint stepx[] = {0,-1,-1,0,1,1};
7 constint stepy[] = {-2,-1,1,2,1,-1};
8 int hi,wi;
9 char puzzle[SIZE][SIZE];
10 bool vis[SIZE][SIZE];
11 bool legal(int x,int y)
12 {
13 return x >=0&& x < hi && y >=0&& y < wi;
14 }
15 bool checkDeg()
16 {
17 for (int i =0;i < hi;i++)
18 for (int j =0;j < wi;j++)
19 if (puzzle[i][j] =='#')
20 {
21 int deg =0;
22 for (int k =0;k <4;k++)
23 {
24 int nx = i + dx[k];
25 int ny = j + dy[k];
26 if (legal(nx,ny) && (((k ==0|| k ==2) && puzzle[nx][ny] =='|') || ((k ==1|| k ==3) && puzzle[nx][ny] =='-')))
27 deg++;
28 }
29 if (deg !=0&& deg !=2)
30 returnfalse;
31 }
32 returntrue;
33 }
34 bool checkNum()
35 {
36 for (int i =0;i < hi;i++)
37 for (int j =0;j < wi;j++)
38 if (puzzle[i][j] >='0'&& puzzle[i][j] <='9')
39 {
40 int deg =0;
41 for (int k =0;k <4;k++)
42 {
43 int nx = i + dx[k];
44 int ny = j + dy[k];
45 if (legal(nx,ny) && (((k ==0|| k ==2) && puzzle[nx][ny] =='-') || ((k ==1|| k ==3) && puzzle[nx][ny] =='|')))
46 deg++;
47 }
48 if (deg != puzzle[i][j] -'0')
49 returnfalse;
50 }
51 returntrue;
52 }
53 void DFS(int x,int y)
54 {
55 vis[x][y] =true;
56 for (int i =0;i <6;i++)
57 {
58 if (puzzle[x][y] =='-')
59 {
60 int nx = x + stepx[i];
61 int ny = y + stepy[i];
62 if (legal(nx,ny) &&!vis[nx][ny] && (puzzle[nx][ny] =='-'|| puzzle[nx][ny] =='|'))
63 DFS(nx,ny);
64 }
65 else
66 {
67 int nx = x + stepy[i];
68 int ny = y + stepx[i];
69 if (legal(nx,ny) &&!vis[nx][ny] && (puzzle[nx][ny] =='-'|| puzzle[nx][ny] =='|'))
70 DFS(nx,ny);
71 }
72 }
73 }
74 bool checkConn()
75 {
76 bool ok =true;
77 memset(vis,false,sizeof(vis));
78 for (int i =0;i < hi && ok;i++)
79 for (int j =0;j < wi && ok;j++)
80 if (puzzle[i][j] =='-')
81 {
82 DFS(i,j);
83 ok =false;
84 }
85 if(ok) returnfalse;
86 for (int i =0;i < hi;i++)
87 for (int j =0;j < wi;j++)
88 if ((puzzle[i][j] =='-'|| puzzle[i][j] =='|') &&!vis[i][j])
89 returnfalse;
90 returntrue;
91 }
92 int main()
93 {
94 int cas;
95 scanf("%d",&cas);
96 while (cas--)
97 {
98 scanf("%d %d",&hi,&wi);
99 hi = hi *2+1;
100 wi = wi *2+1;
101 for (int i =0;i < hi;i++)
102 scanf("%s",puzzle[i]);
103 if (checkDeg() && checkNum() && checkConn()) printf("VALID\n");
104 else printf("INVALID\n");
105 }
106 return0;
107 }