本题是求是否存在一条路径,故用DFS。只用DFS会超时,因此,还需要用到求解距离问题中常用到的奇偶剪枝。
奇偶剪枝请看这个博客,讲解的很透彻 https://blog.youkuaiyun.com/i1020/article/details/54918472
在求解本题中,也遇到了一个大坑,就是flag变量没有初始化,导致一直wrong answer,一定要记得把所有全局变量在每输入一次就初始化一次,不然就声明为局部变量。
#include <stdio.h>
int go[][2]={1,0, -1,0, 0,-1, 0,1};
char map[7][7];
int n, m, t; //地图的行、列,规定的时间
bool flag = false;int abs(int x, int y)
{
return x > y ? x-y : y-x;
}void DFS(int a, int b, int c)
{
if(c > t)
return;
int nx, ny;
for(int i = 0; i < 4; i++)
{
nx = a + go[i][0];
ny = b + go[i][1];
if(nx < 0 || nx >= n || ny < 0 || ny >= m)
continue;
if(map[nx][ny] == 'X')
continue;
if(map[nx][ny] == 'D')
if(c + 1 == t)
{
flag = true;
return;
}
else
continue;
map[nx][ny] = 'X';
DFS(nx, ny, c+1);
map[nx][ny] = '.'; //回溯
}
}int main()
{
int ex, ey; //终点的坐标,找到终点的坐标是为了使用奇偶剪枝
int sx, sy; //起点的坐标
while(scanf("%d %d %d", &n, &m, &t) && n != 0)
{
for(int i = 0; i < n; i++)
{
getchar();
scanf("%s", map[i]);
for(int j = 0; j < m; j++)
{
if(map[i][j] == 'D')
{
ex = i;
ey = j;
}
else if(map[i][j] == 'S')
{
sx = i;
sy = j;
}
}
}
flag = false; //flag变量一定要在这初始化,不然会报错
int tmp = t - abs(sx, ex) - abs(sy, ey);
if(tmp % 2) //奇偶剪枝
flag = false;
else
{
map[sx][sy] = 'X';
DFS(sx, sy, 0);
}
if(flag)
printf("YES\n");
else
printf("NO\n");
}
return 0;
}