题目地址: ttp://acm.hdu.edu.cn/showproblem.php?pid=1010
大致题意:给定迷宫、出口和入口,走迷宫,走过的格子不能再走,每个格子最多停留1秒,出口会在特定的时间打开,只有在出口打开时,才能走出迷宫。判断能否走出迷宫。
思路:DFS+剪枝
剪枝:起点到终点的距离和时间奇偶性不同,舍去
注意:在DFS中恢复改变的格子的状态
#include <cstdio>
#include <cstring>
#include <cstdlib>
using namespace std;
void dfs(int,int,int);
char a[7][7];
int sx, sy, dx, dy;
int d[][2] = { { 1, 0 }, { -1, 0 }, { 0, 1 }, {0,-1} };
int m, n, t;
bool find=false;
int main(void)
{
freopen("checker.out", "w", stdout);
while (scanf("%d %d %d", &n, &m, &t) && m && n && t){
memset(a, 0, sizeof(a));
find = false;
for (int i = 0; i < n; ++i)
for (int j = 0; j < m; ++j){
scanf("%1s", &a[i][j]);
if (a[i][j] == 'S'){
sx = i;
sy = j;
}
if (a[i][j] == 'D'){
dx = i;
dy = j;
}
}
dfs(sx, sy, t);
if (find)
printf("YES\n");
else
printf("NO\n");
}
return 0;
}
void dfs(int x, int y,int time)
{
int sum = abs(dx - x) + abs(dy - y);
if (sum > time || !((time - sum) % 2))
return;
if (time == 0){
if (x == dx && y == dy)
find = true;
}
else{
int i = 0;
for (; i < 4 && !find; ++i){
int x1= x + d[i][0];
int y1 = y + d[i][1];
if (x1 >= 0 && x1 < n && y1 >= 0 && y1 < m && a[x1][y1] != 'X'){
a[x1][y1] = 'X';
dfs(x1, y1,time - 1);
a[x1][y1] = '.';
}
}
}
}