《爱与愁的故事第三弹·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的步数
12 16
18 10
8
9
100%数据:x1,y1,x2,y2<=20
然后改用bfs,第一次以为这个棋盘有(0,0)这个点,然后最后两样例wa了。。改了边界后1<=x,y<=20
#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;
}