洛谷 18-03-14-P1443 马的遍历

对起点进行广搜,将一个点的坐标和到达该点所需要的步数建一个结构体。

搜索一个点的八个方向,符合条件的点入队并记录步数标记该点已走过。

如果有两条路径走到同一个点,那么因为广搜的原因,该点会自己记录到步数小的那个并且标记了ok数组已走过。

#include
#include
#include
#include
using namespace std;
struct point//用结构体表示入队的坐标和走到该坐标需要的步数 
{
	int x,y,c;
};
int ans[410][410];//用来记录步数 
int ok[410][410];//标记是否走过 
int a[8]={-2,-1,1,2,2,1,-1,-2};//ab数组组合8个方向 
int b[8]={1,2,2,1,-1,-2,-2,-1};
int n,m,s1,s2;
void bfs(int x,int y)//进行广搜 
{
	queue q;
	point p;
	p.x=x;p.y=y;p.c=0;
	q.push(p);
	while(!q.empty()){
		int i=q.front().x;
		int j=q.front().y;
		int k=q.front().c;
		q.pop();
		ans[i][j]=k;
		ok[i][j]=1;
		for(int z=0;z<8;z++){
			int w=i+a[z];
			int e=j+b[z];
			if(ok[w][e]==0&&w>=1&&e>=1&&w<=n&&e<=m)//符合条件依次入队 
			{
				point po;
				po.x=i+a[z];
				po.y=j+b[z];
				po.c=ans[i][j]+1;//步数+1 
				ok[w][e]=1;
				q.push(po);
			}
		}
	}
}
int main(){
	scanf("%d%d%d%d",&n,&m,&s1,&s2);
	memset(ans,-1,sizeof(ans));
	memset(ok,0,sizeof(ok));
	bfs(s1,s2);
	for(int i=1;i<=n;i++){
		for(int j=1;j<=m;j++){
			printf("%-5d",ans[i][j]);
		}
		printf("\n");
	}	
	return 0;
} 




你可能感兴趣的:(洛谷)