Knight Moves POJ 1915(bfs)

POJ 1915

题意

编写一个程序,计算一个骑士从棋盘上的一个格子到另一个格子所需的最小步数。骑士一步可以移动到的位置由下图给出。

一匹马走日字,给定起点和终点,问所需要的最小步骤。

思路

一般问到最值很明显就是bfs了,图太大了也不适合dfs。vec是向量,保存了一个点能跳到的坐标。保存从起点开始能第一次跳到的坐标的所有情况,并且刷新这些点的访问情况,访问过的、出界的不访问,按照队列结构依次往下重复直到到达目标点为止。

#include<bits/stdc++.h>

int size ;
struct status{
	int x;
	int y;
	int step;
}q[100006];

int vec[8][2]={{-2,-1},{-1,-2},{-2,1},{-1,2},{2,-1},{1,-2},{2,1},{1,2}};
int is[333][333];
void bfs(int sx,int sy,int ex,int ey){
	int head =0,tail=0;
    memset(is,0,sizeof(is));
	q[tail].x=sx;
	q[tail].y=sy;
	is[sx][sy]=1;
	tail++;
	while (head<tail){
		if (q[head].x==ex&&q[head].y==ey){
				printf("%d\n",q[head].step);
				break ;
		}
		for(int i=0;i<8;i++){
			int nx=q[head].x+vec[i][0];
			int ny=q[head].y+vec[i][1];
			int step=q[head].step;
			if (nx>=0&&nx<size&&ny>=0&&ny<size&&is[nx][ny]==0){
				q[tail].x=nx;
				q[tail].y=ny;
				q[tail].step=step+1;
				is[nx][ny]=1;
				tail++;
			}	
		} 
		head ++;
	}
	
} 

int main(){
	int k;
	scanf("%d",&k);
	int sx,sy,ex,ey;
	while (k--){
		scanf("%d",&size);
		scanf("%d%d%d%d",&sx,&sy,&ex,&ey);
		bfs(sx,sy,ex,ey);
	}
	return 0;
} 
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值