HDU 1010(Tempter of the Bone)
/*DFS
Date: 2012/10/12
题目链接地址:http://www.cnblogs.com/sorryhao/admin/EditPosts.aspx?opt=1
思路:从开始点找,一直找到门,这是判断时间是不是刚好t秒,如果是则输出YES,否则输出NO
需要注意的是奇偶剪枝
奇偶剪枝:http://baike.baidu.com/view/7789287.htm
*/
#include<iostream> #include<cmath> using namespace std; #define maxn 8 char matrix[maxn][maxn]; int n,m,t,si,sj,ei,ej,sum; int dir[4][2] = {-1,0,1,0,0,1,0,-1}; bool flag; bool ok(int i,int j) { return i >= 1 && i <= n && j >= 1 && j <= m && matrix[i][j] != 'X'; } void dfs(int x,int y,int num) { int i,px,py; if(flag) return; //已经找到后,无需再继续找下去 if(x == ei && y == ej && num == t) { flag = 1; return; } if(num > t) return; matrix[x][y] = 'X'; for(i = 0; i < 4; i++) { px = x + dir[i][0],py = y + dir[i][1]; if(ok(px,py)) dfs(px,py,num+1); } matrix[x][y] = '.'; } int main() { //freopen("1008.txt","r",stdin); while(scanf("%d%d%d",&n,&m,&t) && (n||m||t)) { int i,j; sum = 0,flag = false; for(i = 1; i <= n; i++) for(j = 1; j <= m; j++) { cin >> matrix[i][j]; if(matrix[i][j] == 'S') si = i,sj = j,matrix[i][j] = 'X'; else if(matrix[i][j] == 'D') ei = i, ej = j,matrix[i][j] = '.'; else if(matrix[i][j] == '.') sum++; } if((ei+ej+si+sj)%2 != t%2 || sum+1 < t) //奇偶剪枝,也可写为(abs(si-sj)+abs(ei-ej)-t%2 ,可以走的路数小于t { printf("NO\n"); continue; } else dfs(si,sj,0); if(flag) printf("YES\n"); else printf("NO\n"); } return 0; }

浙公网安备 33010602011771号