90求调
查看原帖
90求调
858267
lizi6666楼主2024/8/27 11:51

样例

2 3 1 1

输出如下

0 0 -1

0 -1 1

附上代码

#include<bits/stdc++.h>
using namespace std;
int const N=1e5+100;
int n,m,x,y;
const int mx[9]={0,-1,-2,-2,-1,1,2,2,1};
const int my[9]={0,2,1,-1,-2,2,1,-1,-2};
int ans[500][500],v[500][500];
int nx[N],ny[N];
void bfs(){
	int t=1,w=0;
	nx[1]=x;//初始化起点 
	ny[1]=y;
	while(w<=t){
		w++;
		for(int i=1;i<=8;i++){//八个方向跳跃 
			int nmx=nx[w]+mx[i],nmy=ny[w]+my[i];//移动后的位置 
			if(nmx<1||nmy<1||nmy>m||nmx>n||v[nmx][nmy]==1)continue;//越界或已经来过 
			else{
//				cout<<w<<" "<<i<<endl;
//				cout<<nmx<<" "<<nmy<<endl;
				v[nmx][nmy]=1;//到达新的点标记 
				ans[nmx][nmy]=ans[nx[w]][ny[w]]+1;//步数+1 
				nx[++t]=nmx;//储存新的坐标 
				ny[t]=nmy;
			}
		}
	}
//	for(int i=1;i<=t;i++)cout<<nx[i]<<" "<<ny[i]<<endl; 
}
int main(){
	memset(ans,-1,sizeof(ans));
	cin>>n>>m>>x>>y;
	ans[x][y]=0;
	v[x][y]=1;
	bfs();
	for(int i=1;i<=n;i++){
		for(int j=1;j<=m;j++){
			cout<<setw(4)<<ans[i][j];
		}cout<<endl;
	}
	return 0;
}
2024/8/27 11:51
加载中...