我声明这个题就是个哈皮题,搞几个根本没有现实意义的数据卡你,到底是-1还是0
不想说太多
采用最最基础的BFS,没啥技术含量。看洛谷的题解还有人玩spaf、dfs、dij等等,总之玩法很多,我只会bfs
#include <bits/stdc++.h>
using namespace std;
int main()
{
int n,m,x,y;
cin>>n>>m>>x>>y;
int f[405][405];
bool visit[405][405];
int dx[8] = {1,1,2,2,-1,-1,-2,-2};
int dy[8] = {-2,2,-1,1,2,-2,1,-1};
memset(f,-1,sizeof(f));
memset(visit,false,sizeof(visit));
queue<pair<int,int> > q;
q.push(make_pair(x,y));
visit[x][y] = true;
f[x][y] = 0;
while(!q.empty()){
int xx = q.front().first;
int yy = q.front().second;
q.pop();
for(int i = 0;i < 8;i++){
int u = xx+dx[i];
int v = yy+dy[i];
if(u<1||u>n||v<1||v>m||visit[u][v]){
continue;
}
else{
f[u][v] = f[xx][yy] + 1;
visit[u][v] = true;
q.push(make_pair(u,v));
}
//cout<<"加了一个";
}
}
//cout<<"a";
for(int i = 1;i <= n;i++){
for(int j = 1;j <= m;j++){
printf("%-5d",f[i][j]);
}
if(i != n)
printf("\n");
}
return 0;
}
/*
3个WA提示 read 0 excepted -1
意思就是本来不能达到的点,我认为0步可以达到
0步达到有这几种情况
1 出发点就是结束点
2 当前能走的步数为0,起点初始化为0,正好起点可以走的步数也为0
*/