好奇怪的游戏(BFS)

这篇博客介绍了一个使用广度优先搜索(BFS)算法解决特殊象棋游戏中,两匹马从不同位置到达(1,1)点的最短步数问题。题目要求马可以走日字形或田字形,通过BFS模板实现,遍历所有可能的走法,找到最少步数。示例输入和输出展示了算法的正确性。
摘要由CSDN通过智能技术生成

题目背景

《爱与愁的故事第三弹·shopping》娱乐章。

调调口味来道水题。

题目描述

爱与愁大神坐在公交车上无聊,于是玩起了手机。一款奇怪的游戏进入了爱与愁大神的眼帘:***(游戏名被打上了马赛克)。这个游戏类似象棋,但是只有黑白马各一匹,在点x1,y1和x2,y2上。它们得从点x1,y1和x2,y2走到1,1。这个游戏与普通象棋不同的地方是:马可以走“日”,也可以像象走“田”。现在爱与愁大神想知道两匹马到1,1的最少步数,你能帮他解决这个问题么?

输入格式

第1行:两个整数x1,y1

第2行:两个整数x2,y2

输出格式

第1行:黑马到1,1的步数

第2行:白马到1,1的步数

输入输出样例

输入 #1复制

12 16
18 10

输出 #1复制

8 
9

说明/提示

100%数据:x1,y1,x2,y2<=20

洛谷P1747

思路:看见又是求最短路径就是BFS,只不过走路方式加了4种直接加在inext中就行了 ,套BFS模板

#include <iostream>
#include <queue>
#include <cstring>
using namespace std;
struct node
{
	int x,y,step;//需要步数
};
int x1,y1,x2,y2;
int book[50][50];//存是否经过
int inext[12][2]= {{1,2},{2,1},{-1,2},{-2,1},{-1,-2},{-2,-1},{1,-2},{2,-1},{2,2},{2,-2},{-2,-2},{-2,2}};//12个方向

void bfs(int x ,int y)
{
	queue<node> q;
	node head,tail;
	head.x=x,head.y=y,head.step=0;
	q.push(head);

	while(!q.empty())
	{
		head=q.front();
		q.pop();
		for(int i=0; i<12; i++)
		{
			tail.x=head.x+inext[i][0];
			tail.y=head.y+inext[i][1];
			if(tail.x<1||tail.y<1||book[tail.x][tail.y]!=0||tail.x>20||tail.y>20) continue;
			tail.step=head.step+1;//步数加1
			book[tail.x][tail.y]=1;
			q.push(tail);

			if(tail.x==1&&tail.y==1)//跳到(1,1)的时候输出
			{
				cout << tail.step << endl;
				return;
			}
		}
	}
}
int main()
{
	memset(book,0,sizeof book);
	cin >> x1 >> y1 ;
	bfs(x1,y1);
	memset(book,0,sizeof book);//记得清零
	cin >> x2 >> y2;
	bfs(x2,y2);

}

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值