迷宫 hdu 1010 Tempter of the Bone

http://acm.hdu.edu.cn/showproblem.php?pid=1010

 

 

//深入解析 //1.求某给定时间以内能否找到出口 //2.找到出口的最短时间 //3.条件变为可以停留 #include <stdio.h> #include <math.h> int si,sj; //记录起始点 int di,dj; //记录门的位置 char map[10][10]; int dir[4][2] = {{-1,0},{1,0},{0,-1},{0,1}}; int n,m,t; bool find; bool inside(int i,int j){ if(1 <= i && i <= n && 1 <= j && j <= m) return true; return false; } bool DFS(int ci,int cj,int s) { //当前位置为ci,cj,当前步数为s //从但前位置出发 能否在指定时间到达门 if (s==t && ci == di && cj == dj){ return true; } //奇偶剪枝 //纵向+横向的总时间与剩余时间同奇偶 if((abs(ci - di) + abs(cj - dj)) % 2 != (t - s) % 2) return false; for(int i = 0;i < 4;i++){ int ni = ci + dir[i][0]; int nj = cj + dir[i][1]; if(inside(ni,nj) && map[ni][nj] != 'X'){ map[ni][nj] = 'X'; if(DFS(ni,nj,s + 1)) return true; //回溯前的复原 map[ni][nj] = '.'; } } return false; } /* void DFS(int ci,int cj,int s) { //当前位置为ci,cj,当前步数为s //从但前位置出发 能否在指定时间到达门 if (s==t && ci == di && cj == dj){ find = true; return ; } //奇偶剪枝 //纵向+横向的总时间与剩余时间同奇偶 if((abs(ci - di) + abs(cj - dj)) % 2 != (t - s) % 2) return ; for(int i = 0;i < 4;i++){ int ni = ci + dir[i][0]; int nj = cj + dir[i][1]; if(inside(ni,nj) && map[ni][nj] != 'X'){ map[ni][nj] = 'X'; DFS(ni,nj,s + 1); if(find) return ; //回溯前的复原 map[ni][nj] = '.'; } } return; } */ int main () { //freopen("data.txt","r",stdin); int i,j,num; //跳过一个换行 while(scanf("%d%d%d/n",&n,&m,&t) != EOF) { if (n==0 && m==0 && t==0) return 0; num=0; for (i=1;i <= n;i++){ for (j=1;j <= m;j++){ scanf("%c",&map[i][j]); if(map[i][j] == 'S'){ si=i; sj=j; } else if(map[i][j] == 'D'){ di = i; dj = j; num++; } else if(map[i][j] == '.') num++; } char ch; scanf("%c",&ch); } //可行点少于规定时间 时间剪枝 if(num < t){ printf("NO/n"); continue; } map[si][sj] = 'X'; if(DFS(si,sj,0)) printf("YES/n"); else printf("NO/n"); } return 0; }

你可能感兴趣的:(c)