百度之星资格赛1005 下棋 BFS

下棋

Time Limit: 6000/3000 MS (Java/Others)

Memory Limit: 65536/65536 K (Java/Others)

Problem Description

N?M的棋盘上有一个受伤的国王与一个要去救援国王的骑士,他们每个单位时间必须同时移动一次寻找对方。如下图所示,黑色的图例表示国王(右)或骑士(左)当前所在的位置,那么灰色的位置表示在一次移动中他们可能到达的位置。国王伤势严重,因此他必须在K个单位时间内得到骑士的救援,否则会挂掉。问国王是否可以在K个单位时间内获得救援,如果可以,最短需要花多少个单位时间。

Input

第一行包含一个整数T,(1≤T≤50)代表测试数据的组数,接下来T组测试数据。

每组测试数据第一行包含三个整数N,M,K,
且2≤N,M≤1000, 1≤K≤200。第二行两个整数Xking,Yking,对应国王所在方格的坐标。第三行两个整数Xknight,Yknight,对应骑士所在方格的坐标。其中1≤Xking,Xknight≤N,1≤Yking,Yknight≤M,保证骑士与国王一开始不在同一个方格内且他们都可以移动。:

Output

对于每组测试数据,输出两行:

第一行输出:"Case #i:"。i代表第i组测试数据。

第二行输出测试数据的结果,如果国王可以得到救援,则输出最快需要花多少个单位时间。否则,输出“OH,NO!”。

Sample Input

2
3 2 1
1 1
3 1
3 3 1
1 1
1 2 

Sample Output

Case #1:
1
Case #2:
OH,NO!

用BFS进行遍历,骑士每走到一个格子,就判断他们能不能在这个点相遇,如果可以,算出他们的最小时间(如果骑士先到达那个点,他可以来回走等国王,国王可以通过走斜步来改变步数的奇偶性,可以说他们最后他们一定能相遇,最小时间大于k的话就GG了)

#include<stdio.h>
#include<string.h>
#include<algorithm>
#include<queue>
#include<math.h>
#include<stdlib.h>
using namespace std;
#define N 1000+10
#define inf 0xfffffff
struct node
{
    int x,y,t;
};
bool used[N][N];
int minn,sx,sy,n,m,k;
int dir[8][2]={-2,-1,-1,-2,-1,2,-2,1,1,-2,2,-1,1,2,2,1};
int ex,ey;
int dis(int x,int y,int t)
{
    int d=max(abs(x-ex),abs(y-ey));//国王走斜步来使时间最小
    if(d==0)//如果国王起点就在(x,y)
    {
        if(t%2==0)
                return 0;
    }
    d=abs(d-t);
    return d;

}
void bfs(int sx,int sy)
{
    queue<node>q;
    node temp;
    temp.x=sx;
    temp.y=sy;
    temp.t=0;
    memset(used,false,sizeof(used));
    used[sx][sy]=true;

    q.push(temp);
    while(!q.empty())
    {
        node tmp=q.front();
        q.pop();
        int d=dis(tmp.x,tmp.y,tmp.t);

        if(d%2==0)
        {
            minn=min(minn,d+tmp.t);
        }
        else
        {
            minn=min(minn,d+tmp.t+1);
        }
        for(int i=0;i<8;i++)
        {
            node s;
            s.x=dir[i][0]+tmp.x;
            s.y=dir[i][1]+tmp.y;
            s.t=tmp.t;
            if(s.t>k||s.x<1||s.x>n||s.y<1||s.y>m||used[s.x][s.y]) continue;
                used[s.x][s.y]=true;
                s.t++;
                q.push(s);

        }
    }

}
int main()
{
    int T;
    scanf("%d",&T);
    for(int i=1;i<=T;i++)
    {

        scanf("%d%d%d",&n,&m,&k);
        scanf("%d%d",&ex,&ey);
        scanf("%d%d",&sx,&sy);
         minn=inf;
        bfs(sx,sy);
        printf("Case #%d:\n",i);
        if(minn>k)
            printf("OH,NO!\n");
        else
            printf("%d\n",minn);
    }
    return 0;
}
时间: 2024-10-08 21:40:47

百度之星资格赛1005 下棋 BFS的相关文章

百度之星2015 1005 下棋

思路: 对于任意一个格子,设国王到达这个格子至少需要x步,骑士到达这个格子至少需要y步,则: 对于这个格子, 1)国王到达这个格子需要的步数为:x+k步,其中k=0,1,2,3,4,5,... 2)骑士到达这个格子需要的步数为:x+2*k步,其中k=0,1,2,3,4,5,... 然后对1000*1000个格子都算一遍最小相遇的步数,然后再取个最小值就行了. /*百度之星2015 1005 下棋 思路: 对于任意一个格子,设国王到达这个格子至少需要x步,骑士到达这个格子至少需要y步,则: 对于这

2014百度之星资格赛——Disk Schedule

2014百度之星资格赛--Disk Schedule Problem Description 有很多从磁盘读取数据的需求,包括顺序读取.随机读取.为了提高效率,需要人为安排磁盘读取.然而,在现实中,这种做法很复杂.我们考虑一个相对简单的场景. 磁盘有许多轨道,每个轨道有许多扇区,用于存储数据.当我们想在特定扇区来读取数据时,磁头需要跳转到特定的轨道.具体扇区进行读取操作.为了简单,我们假设磁头可以在某个轨道顺时针或逆时针匀速旋转,旋转一周的时间是360个单位时间.磁头也可以随意移动到某个轨道进行

2014百度之星资格赛题解

比赛链接:点击打开链接 ,,杭电把比赛关了代码都找不到了.. 无责任民科还是mark一下好了.. HDU 4823 Energy Conversion 把式子变换一下发现是一个等比数列,高速幂就可以. #include<stdio.h> #include<iostream> #include<string.h> #include<math.h> using namespace std; #define ll __int64 #define inf 10000

2014百度之星资格赛—— Xor Sum(01字典树)

Xor Sum Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 132768/132768 K (Java/Others) Total Submission(s): 0    Accepted Submission(s): 0 Problem Description Zeus 和 Prometheus 做了一个游戏,Prometheus 给 Zeus 一个集合,集合中包含了N个正整数,随后 Prometheus 将向 Zeus 发起

2014百度之星资格赛第一题

Energy Conversion Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Submission(s): 11867    Accepted Submission(s): 2861 Problem Description 魔法师百小度也有遇到难题的时候-- 现在,百小度正在一个古老的石门面前,石门上有一段古老的魔法文字,读懂这种魔法文字需要耗费大量的能量和大

2014百度之星资格赛第二题

Disk Schedule Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Submission(s): 2560    Accepted Submission(s): 366 Problem Description 有很多从磁盘读取数据的需求,包括顺序读取.随机读取.为了提高效率,需要人为安排磁盘读取.然而,在现实中,这种做法很复杂.我们考虑一个相对简单的场景.

2014百度之星资格赛第三题

Xor Sum Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 132768/132768 K (Java/Others) Total Submission(s): 7837    Accepted Submission(s): 3350 Problem Description Zeus 和 Prometheus 做了一个游戏,Prometheus 给 Zeus 一个集合,集合中包含了N个正整数,随后 Prometheus 将向 Z

2014百度之星资格赛第四题

Labyrinth Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Submission(s): 2911    Accepted Submission(s): 1007 Problem Description 度度熊是一只喜欢探险的熊,一次偶然落进了一个m*n矩阵的迷宫,该迷宫只能从矩阵左上角第一个方格开始走,只有走到右上角的第一个格子才算走出迷宫,每一次只能走一

14年百度之星资格赛第四题

Labyrinth Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total Submission(s): 519 Accepted Submission(s): 174 Problem Description 度度熊是一只喜欢探险的熊,一次偶然落进了一个m*n矩阵的迷宫,该迷宫只能从矩阵左上角第一个方格开始走,只有走到右上角的第一个格子才算走出迷宫,每一次只能走一格,且只能向上向下