代码如下:
#include<iostream>
using namespace std;
// 定义地图
char map[10][10] = { 0 };
// 定义移动方式
int next1[5][3] = { {1,0},{-1,0},{0,1},{0,-1} };
// 行列数,及时间
int line = 0, row = 0, T = 0;
// 定义终点
int el = 0, er = 0;
// 判断能否
int decs = 1,decs1=0;
void dfs(int fl, int fr, int n);
int main()
{
while (scanf("%d %d %d", &line, &row, &T) != EOF&&line!=0&&row!=0&&T!=0)
{
decs = 1, decs1 = 0;
char tru = getchar();
int fl = 0, fr = 0,wall=0;
for (int i = 0; i < line; i++)
{
for (int j = 0; j < row; j++)
{
scanf("%c", &map[i][j]);
// 记录起点坐标
if(map[i][j]=='S'){
fl = i;
fr = j; }
if (map[i][j] == 'X')
wall++;
// 记录终点
if (map[i][j] == 'D'){
el = i;
er = j;}
}
tru = getchar();
}
// 剪枝
if (line * row - wall <= T)
{
printf("NO\n");
continue;
}
map[fl][fr] = 'X';
if (fl == el && fr == er && T == 0)
{
printf("YES\n");
continue;
}
dfs(fl, fr, 1);
if (decs)
printf("NO\n");
}
}
void dfs(int fl, int fr, int n)
{
for (int i = 0; i < 4; i++)
{
//计算移动后的坐标
int tl = fl + next1[i][0];
int tr = fr + next1[i][1];
// 判断T秒时是否到达
if(tl==el&&tr==er&&n==T)
{
decs = 0;
decs1 = 1;
printf("YES\n");
return;
}
//找到以后退出
if (decs1)
return;
// 检查是否超出数组范围
int dec1 = 1,dec2=1;
if (tl < 0 || tl >= line) dec1 = 0;
if (tr < 0 || tr >= row) dec2 = 0;
if (map[tl][tr]=='.' && dec1 && dec2)
{
map[tl][tr] = 'X';
dfs(tl, tr, n + 1);
//找到以后退出
map[tl][tr] = '.';
}
}
}