HDU 1010 Tempter of the Bone

 1 #include <iostream>
 2 #include <cstdio>
 3 #include <cstring>
 4 #include <cmath>
 5 #include <algorithm>
 6 char maze[8][8];
 7 int n, m, t;
 8 int mx, my, X, Y;
 9 int flag, tt;
10 int Move[4][2]= {{-1,0},{1,0},{0,1},{0,-1}};
11 void DFS(int x,int y,int k);
12 int main()
13 {
14     int i, j;
15     while(scanf("%d %d %d",&n,&m,&t)!=EOF, m||n||t)
16     {
17         tt = 0;
18         flag = 0;
19         getchar();
20         for(i = 0; i < n; i++)
21         {
22             for(j = 0; j < m; j++)
23             {
24                 scanf("%c",&maze[i][j]);
25                 if(maze[i][j]=='S')
26                 {
27                     mx = i;
28                     my = j;
29                     maze[mx][my]='X';
30                 }
31                 else if(maze[i][j]=='D')
32                 {
33                     X = i;
34                     Y = j;
35                     tt++;
36                 }
37                 else if(maze[i][j]=='.')
38                     tt++;
39             }
40             getchar();
41         }
42         if(tt>=t && abs(X-mx)+abs(Y-my)<=t)// &&  !(abs(X-mx)+abs(Y-my)-t)&1 不可以加
43             DFS(mx,my,0);
44         if(flag)
45             printf("YES
");
46         else
47             printf("NO
");
48     }
49     return 0;
50 }
51 void DFS(int x,int y,int k)
52 {
53     int i;
54     if(t==k && X==x && Y==y)
55         flag = 1;
56     if(flag)
57         return;
58     int v = t-k-abs(X-x)-abs(Y-y);
59     if(v<0||v&1)
60         return;
61     for(i=0; i<4; i++)
62     {
63         int xx=Move[i][0]+x;
64         int yy=Move[i][1]+y;
65         if(xx>=0 && xx<n && yy>=0 && yy<m && maze[xx][yy]!='X')
66         {
67             maze[xx][yy] = 'X';
68             DFS(xx,yy,k+1);
69             maze[xx][yy] = '.';
70         }
71     }
72 }
View Code

1.奇偶剪枝

2.偶数判断 &1

原文地址:https://www.cnblogs.com/ghostTao/p/4313207.html