题目链接:AOJ 6
不多说,裸bfs,就是 要注意m,n是换过来的 交了一发wa
ac code:
#include <cstdio>
#include <cstring>
#include <cmath>
#include <queue>
using namespace std;
#define debug 0
const int maxn = 20 + 5;
int n, m, t, sx, sy, px, py;
int maze[maxn][maxn], vis[maxn][maxn];
int dir[][2] = { {-1, 0}, {1, 0}, {0, -1}, {0, 1} };
struct node
{ int x, y, foot;
}s, p;
queue<node> q;
bool judge(int x, int y) {
if (x < 1 || x > n || y < 1 || y > m)
return false;
return true;
}
void bfs() {
s.x = sx;
s.y = sy;
s.foot = 0;
q.push(s);
vis[s.x][s.y] = 1;
while (!q.empty()) {
p = q.front();
q.pop();
if (p.x == px && p.y == py) {
//printf("%d\n", p.foot);
printf("YES\n");
return;
}
for (int i = 0; i < 4; i++) {
s.x = p.x + dir[i][0];
s.y = p.y + dir[i][1];
s.foot = p.foot + 1;
if (s.foot > t) {
continue;
}
if (judge(s.x, s.y) && !maze[s.x][s.y] && !vis[s.x][s.y]) {
q.push(s);
vis[s.x][s.y] = 1;
}
}
}
printf("NO\n");
}
int main(){
#if debug
freopen("in.txt", "r", stdin);
#endif //debug
char a;
while (~scanf("%d%d%d", &m, &n, &t), n + m + t) {
memset(maze, 0, sizeof(maze));
memset(vis, 0, sizeof(vis));
for (int i = 1; i <= n; i++)
for (int j = 1; j <= m; j++){
while ((a = getchar()) == ' ' || a == '\n');
if (a == '*') {
maze[i][j] = 1;
}
else {
if (a == 'S') {
sx = i;
sy = j;
}
else {
if (a == 'P') {
px = i;
py=j;
}
}
}
}
bfs();
}
return 0;
}