0
点赞
收藏
分享

微信扫一扫

洛谷p1443

仲秋花似锦 2022-01-10 阅读 49
算法

分析:

本题要求的是到每个点的最短步数,最短这一类的题用宽度搜索算法bfs。

因为马可以再八个方向上移动,所以我们的move数组也要做相应的改变。

最后要注意用-5%d输出,本题问题就不大了。

#include<stdio.h>
//#define min(a,b) a<b?a:b
struct point
{
	int x;
	int y;
};
int n,m;
int map[500][500];
int book[500][500];
int move[8][2] = {{-2,-1},{-2,1},{-1,2},{1,2},{2,1},{2,-1},{1,-2},{-1,-2}};
void dfs(struct point now)
{
	//printf("now.x=%d now.y=%d \n",now.x,now.y);
	for(int i=0;i<8;i++)
	{
		struct point next;
		next.x=now.x+move[i][0];
		next.y=now.y+move[i][1];
		if(next.x<0||next.y<0||next.x>=n||next.y>=m) continue;
		if(book[next.x][next.y]) continue;
		book[next.x][next.y]=1;
		if(map[next.x][next.y]==-1) map[next.x][next.y]=map[now.x][now.y]+1;
		dfs(next);
		book[next.x][next.y]=0;
	}
	return ;
}
int end;
struct point queue[10000000];
void bfs(int now)
{
	while(now<end)
	{
	//	printf("x=%d y=%d\n",queue[now].x,queue[now].y);
		for(int i=0;i<8;i++)
		{
		struct point next;
		next.x=queue[now].x+move[i][0];
		next.y=queue[now].y+move[i][1];
		if(next.x<0||next.y<0||next.x>=n||next.y>=m) continue;
		if(book[next.x][next.y]) continue;
		book[next.x][next.y]=1;
		map[next.x][next.y]=map[queue[now].x][queue[now].y]+1;
		queue[end++]=next;
		}
		++now;		
	}
}
main()
{
	struct point now;
	scanf("%d%d%d%d",&n,&m,&now.x,&now.y);
	for(int i=0;i<=n;i++)
	{
		for(int j=0;j<=m;j++)
		{
			map[i][j]=-1;
		}
	}	
	now.x--;
	now.y--;
	book[now.x][now.y]=1;
	map[now.x][now.y]=0;
	//dfs(now);
	end=1;

	queue[0]=now;
	bfs(0);
	for(int i=0;i<n;i++)
	{
		for(int j=0;j<m;j++)
		{
			printf("%-5d",map[i][j]);
		}
		printf("\n");
	}
//	printf("\n\n");
//	for(int i=0;i<end;i++)
//	{
//		printf("i=%d x=%d y=%d\n",i,queue[i].x,queue[i].y);
//	}
}
举报

相关推荐

0 条评论