对BFS很不熟 好像要用到队列
只会写DFS暴力 八个方向搜就行 大约到一个数就不搜了弹回来
代码如下
#include<iostream>
#include<cstdio>
#include<cctype>
#include<cstring>
#include<string>
using namespace std;
#define in = read()
typedef long long ll;
const ll size = 500 + 10;
ll n,m,fx,fy;
ll map[size][size];
ll ans;
inline ll read(){
ll num = 0 , f = 1; char ch = getchar();
while(!isdigit(ch)){
if(ch == '-') f = -1;
ch = getchar();
}
while(isdigit(ch)){
num = num*10 + ch - '0';
ch = getchar();
}
return num*f;
}
void dfs(ll x,ll y,ll ans){
if(ans > 168) return;
map[x][y] = ans;
if(x + 1 <= n && y + 2 <= m &&(map[x + 1][y + 2] == -1||map[x + 1][y + 2] > ans + 1))
dfs(x + 1,y + 2,ans + 1);
if(x + 2 <= n && y + 1 <= m &&(map[x + 2][y + 1] == -1||map[x + 2][y + 1] > ans + 1))
dfs(x + 2,y + 1,ans + 1);
if(x - 1 >= 1 && y - 2 >= 1 &&(map[x - 1][y - 2] == -1||map[x - 1][y - 2] > ans + 1))
dfs(x - 1,y - 2,ans + 1);
if(x - 2 >= 1 && y - 1 >= 1 &&(map[x - 2][y - 1] == -1||map[x - 2][y - 1] > ans + 1))
dfs(x - 2,y - 1,ans + 1);
if(x + 1 <= n && y - 2 >= 1 &&(map[x + 1][y - 2] == -1||map[x + 1][y - 2] > ans + 1))
dfs(x + 1,y - 2,ans + 1);
if(x - 1 >= 1 && y + 2 <= m &&(map[x - 1][y + 2] == -1||map[x - 1][y + 2] > ans + 1))
dfs(x - 1,y + 2,ans + 1);
if(x - 2 >= 1 && y + 1 <= m &&(map[x - 2][y + 1] == -1||map[x - 2][y + 1] > ans + 1))
dfs(x - 2,y + 1,ans + 1);
if(x + 2 <= n && y - 1 >= 1 &&(map[x + 2][y - 1] == -1||map[x + 2][y - 1] > ans + 1))
dfs(x + 2,y - 1,ans + 1);
}
int main(){
n in; m in; fx in; fy in;
memset(map,-1,sizeof(map));
dfs(fx,fy,0);
for(int i=1;i<=n;i++){
for(int j=1;j<=m;j++)
printf("%-5d",map[i][j]);
printf("\n");
}
}
//COYG