题目Tempter of the bone:http://ac.jobdu.com/problem.php?pid=1461
题意:有一个N*M的迷宫,包括起点S,终点D,墙X和地面,0秒时主人公从S出发,每秒能走到与其相邻的位置中的一个,且每个位置被行走之后都不能再次走入,问是否存在这样一条路径使主人公在 T 秒时刚好走到D
注意点:每次DFS()后一定要恢复[点的可访问性]
#include<cstdio>
using namespace std;
char row[10][10] = { 0 }; //初始地图
int map[10][10] = { 0 }; //记录是否 有路
bool mark[10][10] = { false }; //记录 是否 已访问
int flag = 0;
int go[][2] = { //坐标变换数组
1, 0,
-1, 0,
0, 1,
0, -1
};
int A, B, T;
void DFS(int nx, int ny, int ex, int ey, int time) {
if (ex == nx && ey == ny) {//成功
if (time == T) {
flag = 1; //记录有解
}
return;
}
for (int i = 0; i < 4; i++) {
int tx = nx + go[i][0];
int ty = ny + go[i][1];
//不在区域内
if (tx < 0 || tx >= A || ty < 0 || ty >= B) continue;
if (true == mark[tx][ty]) continue; //已访问
if (0 == map[tx][ty]) continue; //墙
mark[tx][ty] = true;
DFS(tx, ty, ex, ey, time + 1);
mark[tx][ty] = false; //恢复【关键步骤】
}
}
int main() {
while (scanf("%d%d%d", &A, &B, &T) != EOF) {
if (0 == A && 0 == B && 0 == T) break; //结束
flag = 0; //初始化
int start_x, start_y, end_x, end_y;
for (int i = 0; i < A; i++) {
scanf("%s", row[i]);
for (int j = 0; j < B; j++) {
if ('S' == row[i][j]) { //起点
start_x = i; start_y = j;
}
//终点【注: 终点也要设置为 "路"】
if ('D' == row[i][j]) {
end_x = i;
end_y = j;
map[i][j] = 1;
}
if ('.' == row[i][j]) map[i][j] = 1; //路
if ('X' == row[i][j]) map[i][j] = 0; //墙
mark[i][j] = false;
}
}
DFS(start_x, start_y, end_x, end_y, 0);
if (0 == flag)
printf("NO\n");
else
printf("YES\n");
}
return 0;
}