本文主要是介绍【一只蒟蒻的刷题历程】【洛谷】P1747 好奇怪的游戏(bfs),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
题目背景
《爱与愁的故事第三弹·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
思路:
一开始用的dfs,结果是这样的,有点夸张(也可能代码写错)
然后改用bfs,第一次以为这个棋盘有(0,0)这个点,然后最后两样例wa了。。改了边界后1<=x,y<=20
代码:
#include <iostream>
#include <queue>
using namespace std;
struct node{int x,y,step;node(int a,int b,int c){x=a;y=b;step=c;}
};int dx[]={-1,-2,-2,-1,1,2,2,1,-2,-2,2,2}; //每一步所有可能走的位置
int dy[]={-2,-1,1,2,-2,-1,1,2,-2,2,-2,2};
bool inq[20][20]={false}; //记录入队int bfs(int x,int y,int step)
{queue<node> q;inq[x][y]=1;q.push(node(x,y,step));while(!q.empty()){node f = q.front();q.pop();for(int i=0;i<12;i++){int newx=f.x+dx[i];int newy=f.y+dy[i];if(newx==1 && newy==1) //下一步可以到(1,1)return f.step+1; //当前到(1,1)还需要走一步if(inq[newx][newy]==0 && newx>0 && newx<20 && newy>0 && newy<20)//在边界内,并且没有入过队{inq[newx][newy]=1; //记录入过队q.push(node(newx,newy,f.step+1)); //入队}}}
}int main()
{int x1,y1,x2,y2;cin>>x1>>y1>>x2>>y2;cout<<bfs(x1,y1,0)<<endl; fill(inq[0],inq[0]+20*20,0); //初始化入队情况cout<<bfs(x2,y2,0);return 0;
}
这篇关于【一只蒟蒻的刷题历程】【洛谷】P1747 好奇怪的游戏(bfs)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!