高配版的走迷宫问题,可以往八个方向走,分支变多了,思路及模板不变。
#include <iostream>
#include <algorithm>
#include <queue>
#include <cstring>
using namespace std;
typedef pair<int, int> PII;
const int N = 310;
int n;
int dist[N][N];
PII start, ed;
int dx[8] = {1, 2, 2, 1, -1, -2, -2, -1}, dy[8] = {2, 1, -1, -2, -2, -1, 1, 2};
int bfs()
{
if (start == ed) return 0; //起点等于终点的情况
queue<PII> q;
q.push(start);
memset(dist, -1, sizeof dist);
dist[start.first][start.second] = 0;
while (q.size())
{
auto t = q.front();
q.pop();
for (int i = 0; i < 8; i ++ )
{
int x = t.first + dx[i], y = t.second + dy[i];
if (x >= 0 && x < n && y >= 0 && y < n && dist[x][y] == -1) //不能走已经走过的格子
{
dist[x][y] = dist[t.first][t.second] + 1; //一边走一边计算步数
if (ed == make_pair(x, y)) return dist[x][y]; //注意make_pair用法
q.push({x, y});
}
}
}
return -1;
}
int main()
{
int T;
cin >> T;
while (T -- )
{
cin >> n;
cin >> start.first >> start.second; //记录起点与终点坐标
cin >> ed.first >> ed.second;
cout << bfs() << endl;
}
return 0;
}