hdu 1010
地址:http://acm.hdu.edu.cn/showproblem.php?pid=1010
题意:迷宫,是否能恰好t步走到终点。
mark:奇偶剪枝法!!!这篇博客写的不错http://www.cppblog.com/Geek/archive/2010/04/26/113615.html
代码:
#include <stdio.h> #include <string.h> #include <stdlib.h> int n,m,t,sum,flag; char a[10][10]; int s1,s2,d1,d2; int tab[4][2] = {1, 0, -1, 0, 0, 1, 0, -1}; int fab(int a) {return a < 0 ? -a : a;} void dfs(int x, int y, int step) { int temp = t-step-fab(d1-x)-fab(d2-y); if(temp < 0 || (temp & 1)) return ; for(int i = 0; i < 4; i++) { int xx = x+tab[i][0]; int yy = y+tab[i][1]; if(a[xx][yy] == 'D' && step == t-1) {flag = 1; return ;} if(xx >= 0 && xx < n && yy >= 0 && yy < m && a[xx][yy] == '.') { a[xx][yy] = 'X'; dfs(xx, yy, step+1); a[xx][yy] = '.'; if(flag) return ; } } } int main() { int i,j; while(scanf("%d %d %d%*c", &n, &m, &t), n) { sum = 0; flag = 0; for(i = 0; i < n; i++) { for(j = 0; j < m; j++) { scanf("%c", &a[i][j]); if(a[i][j] == 'S') s1 = i, s2 = j; if(a[i][j] == 'D') d1 = i, d2 = j; if(a[i][j] == 'X') sum++; } getchar(); } if(n*m-sum > t) dfs(s1, s2, 0); puts(flag ? "YES" : "NO"); } return 0; }