链接:http://acm.hdu.edu.cn/showproblem.php?pid=1175
题意:判断两个位置的图案能否消除(存在不超过两次拐弯的连线)。
解题过程:
1、一开始开vis[][]记录已走过的位置,每个位置只能走一次。这样明显不行,因为一些拐弯超过两次的路线会与正确的路线重合,那么正确的路线就行不通了。
2、跳出条件设置的地方错了,导致暴栈。
1 #include <cstdio>
2 #include <cstring>
3 #define N 1005
4
5 int a[N][N], n, m, flag, x1, x2, y1, y2, ans;
6 int dir[4][2] = {1,0,-1,0,0,1,0,-1};
7
8 void dfs(int x0, int y0, int xn, int yn)
9 {
10 if(xn==x2 && yn==y2) {ans = 1; return;}
11 for(int i=0; i<4; i++)
12 {
13 if(ans==1) return;
14 int xnn = xn + dir[i][0], ynn = yn + dir[i][1];
15 if(xnn==x0 && ynn==y0) continue;
16 if(xnn<=n && xnn>=1 && ynn<=m && ynn>=1 && a[xnn][ynn]==0)
17 {
18 if(xnn!=x0 && ynn!=y0)
19 {
20 if(flag>=2) continue;
21 flag++;
22 dfs(xn, yn, xnn, ynn);
23 flag--;
24 }
25 else
26 dfs(xn, yn, xnn, ynn);
27 }
28 }
29 }
30
31 int main()
32 {
33 int q;
34 while(scanf("%d%d",&n,&m)!=EOF)
35 {
36 if(n==0 && m==0) break;
37 for(int i=1; i<=n; i++)
38 for(int j=1; j<=m; j++)
39 scanf("%d",&a[i][j]);
40 scanf("%d",&q);
41 for(int i=1; i<=q; i++)
42 {
43 ans = 0; flag = 0;
44 scanf("%d%d%d%d",&x1,&y1,&x2,&y2);
45 if(x1==x2 && y1==y2) printf("NO ");
46 else
47 {
48 if(a[x1][y1]==a[x2][y2] && a[x1][y1]!=0)
49 {
50 int temp2 = a[x2][y2];
51 a[x2][y2] = 0;
52 dfs(x1,y1,x1,y1);
53 a[x2][y2] = temp2;
54 }
55 if(ans==1)
56 printf("YES ");
57 else
58 printf("NO ");
59 }
60 }
61 }
62 return 0;
63 }
2 #include <cstring>
3 #define N 1005
4
5 int a[N][N], n, m, flag, x1, x2, y1, y2, ans;
6 int dir[4][2] = {1,0,-1,0,0,1,0,-1};
7
8 void dfs(int x0, int y0, int xn, int yn)
9 {
10 if(xn==x2 && yn==y2) {ans = 1; return;}
11 for(int i=0; i<4; i++)
12 {
13 if(ans==1) return;
14 int xnn = xn + dir[i][0], ynn = yn + dir[i][1];
15 if(xnn==x0 && ynn==y0) continue;
16 if(xnn<=n && xnn>=1 && ynn<=m && ynn>=1 && a[xnn][ynn]==0)
17 {
18 if(xnn!=x0 && ynn!=y0)
19 {
20 if(flag>=2) continue;
21 flag++;
22 dfs(xn, yn, xnn, ynn);
23 flag--;
24 }
25 else
26 dfs(xn, yn, xnn, ynn);
27 }
28 }
29 }
30
31 int main()
32 {
33 int q;
34 while(scanf("%d%d",&n,&m)!=EOF)
35 {
36 if(n==0 && m==0) break;
37 for(int i=1; i<=n; i++)
38 for(int j=1; j<=m; j++)
39 scanf("%d",&a[i][j]);
40 scanf("%d",&q);
41 for(int i=1; i<=q; i++)
42 {
43 ans = 0; flag = 0;
44 scanf("%d%d%d%d",&x1,&y1,&x2,&y2);
45 if(x1==x2 && y1==y2) printf("NO ");
46 else
47 {
48 if(a[x1][y1]==a[x2][y2] && a[x1][y1]!=0)
49 {
50 int temp2 = a[x2][y2];
51 a[x2][y2] = 0;
52 dfs(x1,y1,x1,y1);
53 a[x2][y2] = temp2;
54 }
55 if(ans==1)
56 printf("YES ");
57 else
58 printf("NO ");
59 }
60 }
61 }
62 return 0;
63 }
/*
13 5
0 0 0 0 0
0 0 0 4 0
0 0 0 4 0
0 0 0 4 0
0 0 0 4 0
0 0 0 4 0
0 0 0 4 0
0 0 0 4 0
0 0 0 4 0
0 0 0 4 0
0 4 1 4 0
0 4 4 4 0
0 0 0 0 1
1
13 5 11 3
YES
*/