洛谷 P1747 好奇怪的游戏

题目背景

《爱与愁的故事第三弹·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

思路:搜索。

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

 

posted @ 2017-12-12 22:24  一蓑烟雨任生平  阅读(191)  评论(0编辑  收藏  举报