题意:
一个没有方向感的萌妹纸走迷宫,规定只能转k次方向,给迷宫,问这个妹纸是否能走出迷宫。
解析:
这题有几个坑点,首先是m,n,然后是sx,sy,ex,ey。
做法是横冲直撞,直接一条道走到黑,标记,入队就好了。
代码:
#include <iostream>
#include <cstdio>
#include <cstdlib>
#include <algorithm>
#include <cstring>
#include <cmath>
#include <stack>
#include <vector>
#include <queue>
#include <map>
#define LL long long
#define lson lo, mi, rt << 1
#define rson mi + 1, hi, rt << 1 | 1
using namespace std;
const int maxn = 100 + 10;
const int inf = 0x3f3f3f3f;
const double eps = 1e-6;
const double pi = acos(-1.0);
const double ee = exp(1.0);
int dir[][2] = {{1, 0}, {-1, 0}, {0, 1}, {0, -1}};
int n, m, k;
char g[maxn][maxn];
int timeMark[maxn][maxn];
int sx, sy, ex, ey;
struct Point
{
int x, y;
Point(int _x, int _y)
{
x = _x;
y = _y;
}
};
bool bfs()
{
queue<Point> q;
q.push(Point(sx, sy));
int cnt;
while (!q.empty())
{
Point now = q.front();
q.pop();
int x = now.x;
int y = now.y;
cnt = timeMark[x][y] + 1;
for (int i = 0; i < 4; i++)
{
int nx = x + dir[i][0];
int ny = y + dir[i][1];
while (0 <= nx && nx < n && 0 <= ny && ny < m && g[nx][ny] == '.')
{
if (nx == ex && ny == ey && cnt <= k)
return true;
if (timeMark[nx][ny] == -1)
{
timeMark[nx][ny] = cnt;
q.push(Point(nx, ny));
}
nx += dir[i][0];
ny += dir[i][1];
}
}
}
return false;
}
int main()
{
#ifdef LOCAL
freopen("in.txt", "r", stdin);
#endif // LOCAL
int ncase;
scanf("%d", &ncase);
while (ncase--)
{
scanf("%d%d", &n, &m);
for (int i = 0; i < n; i++)
{
scanf("%s", g[i]);
}
scanf("%d%d%d%d%d", &k, &sy, &sx, &ey, &ex);
memset(timeMark, -1, sizeof(timeMark));
sx--, sy--, ey--, ex--;
if (bfs())
{
printf("yes\n");
}
else
{
printf("no\n");
}
}
return 0;
}