#include <iostream>
#include <string>
#include <set>
#include <algorithm>
#include <map>
#include <vector>
#include <queue>
using namespace std;
#define MAX 999999
int dir[4][2] = {{0,1},{0,-1},{1,0},{-1,0}};
char MAP[101][101];
int val[101][101][5];
int m, n, turn;
typedef struct
{
int x, y;
int direction;
}Node;
int main()
{
int N;
int i, j, k;
Node s, t, tt;
int sx, sy, ex, ey;
cin >> N;
while (N--)
{
cin >> m >> n;
for (i = 0;i < m; i++)
{
for (j = 0; j < n; j++)
{
cin >> MAP[i][j];
}
}
for (i = 0; i < m; i++)
for(j = 0; j < n; j++)
for(k = 1; k <= 4; k++)
val[i][j][k] = MAX;
cin >> turn;
cin >> sy >> sx >> ey >> ex;
sy--; sx--; ey--; ex--;
if (sx == ex && sy == ey)
{
cout << "yes" << endl;
continue;
}
s.x = sx;
s.y = sy;
s.direction = 0;
val[s.x][s.y][0] = 0;
val[s.x][s.y][1] = 0;
val[s.x][s.y][2] = 0;
val[s.x][s.y][3] = 0;
val[s.x][s.y][4] = 0;
queue<Node> q;
q.push(s);
bool flag = false;
while (!q.empty())
{
t = q.front();
q.pop();
if (t.x == ex && t.y == ey)
break;
for (i = 0; i < 4; i++)
{
tt.x = t.x + dir[i][0];
tt.y = t.y + dir[i][1];
tt.direction = t.direction;
if (MAP[tt.x][tt.y] == '.' && tt.x>=0&&tt.x<m && tt.y>=0&&tt.y<n)
{
int cnt = 0;
if (tt.direction == 0) //第一次
{
tt.direction = i + 1;
}
else if (tt.direction != i + 1) // 转弯
{
tt.direction = i + 1;
cnt = 1;
}
if (val[t.x][t.y][t.direction]+cnt < val[tt.x][tt.y][tt.direction] && val[t.x][t.y][t.direction]+cnt<= turn)
{
val[tt.x][tt.y][tt.direction] = val[t.x][t.y][t.direction]+cnt;
q.push(tt);
}
}
}
}
for (i=1; i<=4; ++i)
{
if(val[ex][ey][i] != MAX)
break;
}
if (i<=4)
{
cout << "yes" << endl;
}
else
cout << "no" << endl;
}
return 0;
}

本文介绍了一种基于迷宫寻路的算法实现,利用C++编程语言,通过定义迷宫地图和状态节点,实现了从起点到终点的有效路径寻找。该算法考虑了方向变化的代价,并能判断是否能在给定转弯次数内到达目标。

166

被折叠的 条评论
为什么被折叠?



