好马不吃回头草BFS

题目描述

“好马不吃回头草!”。有道理!!!,虽然鱼大大也不知道道理在哪里,但是他就是觉得这句话很有道理。于是乎,他便养成了一个习惯,下象棋时,他的马从来都是毫无撤退可言!

现给出一张巨大的棋盘,问象棋中的马(走日字型)由鱼大大操控,从棋盘上一个点吃掉另一个点的“帅”最少需要几步。(起点记作0步,帅不动)

注: 鱼大大在黑色方,即上方

【输入格式】

第一行输入一个整数n,表示棋盘的大小为n*n,棋盘两个维度的坐标都是从1到n

接下来两行每行两个整数分别表示马出发点的坐标与帅终点的坐标。(第一个为行,第二个为列)

【输出格式】

输出一个整数,表示最小步数,若无法到达输出-1

【样例输入】

50 1 1 30 50

【样例输出】

26

【数据范围】

   3 ≤ n ≤ 500;

 AC:

#include<bits/stdc++.h>
using namespace std;
int n,sx,sy,ex,ey;
bool vis[505][505];
int dx[4]={1,2,1,2};
int dy[4]={2,1,-2,-1};
struct node{
	int x,y,step;
};
void bfs(int x,int y){
	queue<node> q;
	q.push(node{x,y,0});
	while(!q.empty()){
		node nd=q.front();
		q.pop();
		for(int i=0;i<4;i++){//遍历方向
			int tx=nd.x+dx[i],ty=nd.y+dy[i];
			if(tx==ex&&ty==ey){
				cout<<nd.step+1;
				return;
			}
			if(tx>=1&&tx<=n&&ty>=1&&ty<=n&&vis[tx][ty]==0){
				vis[tx][ty]=1;
				q.push(node{tx,ty,nd.step+1});
			}
		}
	} 
	cout<<-1;
} 
int main(){
	cin>>n>>sx>>sy>>ex>>ey;
	vis[sx][sy]=1;
	bfs(sx,sy);
	return 0;
}

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值