【一只蒟蒻的刷题历程】【洛谷】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,结果是这样的,有点夸张(也可能代码写错)
【一只蒟蒻的刷题历程】【洛谷】P1747 好奇怪的游戏(bfs)_第1张图片

然后改用bfs,第一次以为这个棋盘有(0,0)这个点,然后最后两样例wa了。。改了边界后1<=x,y<=20
【一只蒟蒻的刷题历程】【洛谷】P1747 好奇怪的游戏(bfs)_第2张图片


代码:

#include 
#include 
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;
}

你可能感兴趣的:(#,搜索)