zoj 2110 Tempter of the Bone【邻接阵,dfs】
题目连接:http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemId=1110
大致题意:第一行n,m,t代表n行m列的图,t是门开的时间,门开不超过1s。
接下来n行m列的图。
'.'代表通路
'X'代表墙
'S'代表初始位置
'D'代表门的位置
要求必须在t秒钟从S到达D,能到输出YES,否则输出NO。
#include<stdio.h> char gird[8][8]; int n, m, t, ans, a1, b1; void dfs(int i, int j, int k) { if(i == a1 && j == b1 && k == t) { ans = 1; return ; } gird[i][j] = 'X'; if(j+1 <= m && gird[i][j+1] != 'X') { dfs(i, j+1, k+1); if(ans) return ; } if(i+1 <= n && gird[i+1][j] != 'X') { dfs(i+1, j, k+1); if(ans) return ; } if(i-1 >= 1 && gird[i-1][j] != 'X') { dfs(i-1, j, k+1); if(ans) return ; } if(j-1 >= 1 && gird[i][j-1] != 'X') { dfs(i, j-1, k+1); if(ans) return ; } gird[i][j] = '.'; } int main() { while(scanf("%d %d %d%*c", &n, &m, &t) , n+m+t) { int a, b; for(int i = 1; i <= n; i++) { for(int j = 1; j <= m; j++) { scanf("%c", &gird[i][j]); if(gird[i][j] == 'S') { a = i; b = j; } if(gird[i][j] == 'D') { a1 = i; b1 = j; } } scanf("%*c"); } ans = 0; dfs(a, b, 0); if(ans) { printf("YES\n"); } else { printf("NO\n"); } } return 0; }