问题描述:一个迷宫有 NXM 格,有一些格子是地板,能走;有一些格子是障碍,不能走。给一个起点S和一个终点D。一只小狗从 S出发,每步走一块地板,在每块地员不能停留,而且走过的地板都不能再走。给定一个 T,问小狗能正好走 T步到达D吗?输入:有很多测试样例。每个测试中,第1行输入整数 N,M,T(1<N,M<7,0<T<50)。后面N 行中,每行输入M 个字符,有这些字符可以输入:'X':墙;S':起点;D:终点;",:地板。最后一行输入'000',表示输入结束。
输出:每个测试,如果狗能到达,输出YES,否则输出 NO。
cpp
#include <iostream>
using namespace std;
char mat[8][8], visit[8][8];
int n, m, t;
int flag;
int a, b, c, d;
int dir[4][2] = { {1,0},{-1,0},{0,1},{0,-1} };
#define check(xx,yy)(xx>=0&&yy>=0&&xx<n&&yy<n)
void dfs(int time,int x,int y)
{
if (flag)return;
if (mat[x][y] =='D')
{
if(time==t)flag = 1;
return;
}
int tem = t - time - (abs(c - x) + abs(d - y));
if (tem < 0) return;
for (int i = 0; i < 4; i++)
{
int xx = x + dir[i][0];
int yy = y + dir[i][1];
if (check(xx, yy) && mat[xx][yy] != 'X' && !visit[xx][yy])
{
visit[xx][yy] = 1;
dfs(time + 1, xx, yy);
visit[xx][yy] = 0;
}
}
return;
}
void solve()
{
cin >> n >> m >> t;
for (int i = 0; i < n; i++)
{
int ts = 0;
for (int j = 0; j < m; j++)
{
cin >> mat[i][j];
if (mat[i][j] == '0')ts++;
if ('S'== mat[i][j])
{
a = i;
b = j;
}
if ('D' == mat[i][j])
{
c = i;
d = j;
}
}
if (ts==3) break;
}
memset(visit, 0, sizeof(visit));
int tem = t - abs(c - a) - abs(d - b);
if (tem &1) { cout << "N0"; return; }
flag = 0;
visit[a][b] = 1;
dfs(0, a, b);
if (flag)
{
cout << "YES" << endl;
}
else
{
cout << "NO" << endl;
}
}
signed main()
{
ios::sync_with_stdio;
cin.tie(0);
cout.tie(0);
int num = 1;
while (num--)
{
solve();
}
}