题目背景
《爱与愁的故事第三弹·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的距离
输入输出样例
说明
100%数据:x1,y1,x2,y2<=20
思路:搜索。
#include<queue> #include<cstdio> #include<cstring> #include<iostream> #include<algorithm> using namespace std; int x1,x2,y1,y2; int vis[1010][1010]; int ans=0x7f7f7f7f; int dx[12]={2,2,2,2,1,1,-1,-1,-2,-2,-2,-2}; int dy[12]={-2,-1,1,2,-2,2,-2,2,-1,-2,1,2}; struct nond{ int x,y,step; }; void bfs(int x,int y){ queue<nond>que; nond tmp;tmp.x=x;tmp.y=y;tmp.step=0; que.push(tmp); while(!que.empty()){ nond now=que.front(); que.pop(); for(int i=0;i<12;i++){ nond c; c.x=now.x+dx[i]; c.y=now.y+dy[i];c.step=now.step+1; if(c.x>=1&&c.y>=1&&c.x<=50&&c.y<=50&&!vis[c.x][c.y]){ vis[c.x][c.y]=now.step+1; que.push(c); } } if(vis[1][1]) break; } } int main(){ scanf("%d%d%d%d",&x1,&y1,&x2,&y2);vis[x1][y1]=1;vis[x2][y2]=1; bfs(x1,y1);cout<<vis[1][1]<<endl;memset(vis,0,sizeof(vis));vis[x2][y2]=1; bfs(x2,y2);cout<<vis[1][1]; }