题意: 就是判断在t步之内是否可以从S点到达P点
能 YES
否则 NO
还是广搜:
#include <iostream>
#include <queue>
using namespace std;
int go[4][2] = {{-1,0},{0,-1},{0,1},{1,0}};
int n,m,t;
char a[101][101];
struct point
{
int x,y;
int k;
}p;
int dfs()
{
queue<point>q;
int i;
point current,next;
q.push(p);
while(!q.empty())
{
current = q.front();
q.pop();
for(i = 0; i < 4; i++)
{
next.x = current.x + go[i][0];
next.y = current.y + go[i][1];
if(a[next.x][next.y]!='*'&&next.x>=0&&next.x<n&&next.y<m&&next.y>=0)
{
if(a[next.x][next.y]=='P')
return current.k+1;
next.k = current.k+1;
a[next.x][next.y] = '*';
q.push(next);
}
}
}
return -1;
}
int main()
{
while(cin >> m >> n >> t&&n||m||t)
{
for(int i = 0; i < n; i++)
for(int j = 0; j < m; j++)
a[i][j] = '*';
for(int i = 0; i < n; i++)
for(int j = 0; j < m; j++)
cin >> a[i][j];
for(int i = 0; i < n; i++)
for(int j = 0; j < m; j++)
{
if(a[i][j] == 'S')
{
a[i][j] = '*';
p.x = i;
p.y = j;
p.k = 0;
}
}
int ans = dfs();
if(ans!=-1&&ans<=t)
cout << "YES" << endl;
else
cout << "NO" << endl;
}
return 0;
}