方法:bfs
先放AC代码:
#include<iostream>
#include<queue>
#include<algorithm>
using namespace std;
typedef pair<int, int> PII;
#define x first
#define y second
int dx[] = { -2,-1,1,2,2,1,-1,-2 }, dy[] = { 1,2,2,1,-1,-2,-2,-1 };
const int N = 410;
int f[N][N];
int n, m;
void bfs(int sx, int sy)
{
queue<PII> q;
q.push({ sx,sy });
int num = 0;
f[sx][sy] = 0;
int res = 0;
while (q.size())
{
auto t = q.front();
q.pop(); //弹出->可以走
for (int i = 0; i < 8; i++) {
int ssx =t.x + dx[i];
int ssy =t.y + dy[i];
if (ssx <=0 || ssx > n || ssy <=0 || ssy > m || f[ssx][ssy]||(ssx==sx&&ssy==sy)) continue;
q.push({ ssx,ssy });
f[ssx][ssy] =f[t.x][t.y]+1;
}
}
}
void get(int sx,int sy)
{
for (int i = 1; i <= n; i++) {
for (int j = 1; j <= m; j++) {
if (f[i][j] == 0) f[i][j] = -1;
}
}
f[sx][sy] = 0;
}
int main()
{
cin >> n >> m;
int x, y;
cin >> x >> y;
bfs(x, y);
get(x,y);
for (int i = 1; i <= n; i++) {
for (int j = 1; j <= m; j++) {
printf("%-5d", f[i][j]);//这个-5卡了一下,左右不分
}
printf("\n");
}
}
思想:
1.bfs直接用队列
2.需要出列->非常重要的一点
3.【每走一次,都需要让上一步的数组的值+1并且赋值给此步】这一点非常重要
4.偏移量技巧:马可以向四周跳8个位置,即有8种状态。那么定义8个状态的x,y偏移量数组分别为dx,dy;
dfs解法晚点写
有关bfs的题目:
1.红与黑(dfs也可以做)
有关偏移量技巧的题目
1.蛇形矩阵