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;
}

 

posted @ 2012-10-31 20:11  小猴子、  阅读(241)  评论(0编辑  收藏  举报