HDU 搜索练习 Catch him

Catch him

Time Limit: 5000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)
Total Submission(s): 797 Accepted Submission(s):
361

Problem Description

在美式足球中,四分卫负责指挥整只球队的进攻战术和跑位,以及给接球员传球的任务。四分卫是一只球队进攻组最重要的球员,而且一般身体都相对比较弱小,所以通常球队会安排5-7名大汉来保护他,其中站在四分卫前方、排成一线的5名球员称为进攻锋线,他们通常都是135公斤左右的壮汉。

对防守方来说,攻击对手的四分卫当然是最直接的限制对手进攻的方法。如果效果好,就可以在对方四分卫传球之前将其按翻在地,称之为擒杀。擒杀是最好的鼓舞防守队士气的方法,因为对方连传球的机会都没有,进攻就结束了,还必须倒退一些距离开球。凶狠的擒杀甚至能够将对方的四分卫弄伤,从而迫使对方更换这个进攻核心。
在本题中,输入给出准备擒杀四分卫的防守球员的位置、对方每个进攻锋线球员的位置以及对方四分卫的位置,你的任务是求出这名准备擒杀的防守球员至少要移动多少步,才能够擒杀对方四分卫。
假设对方进攻锋线和四分卫在这个过程中都不会移动。只有1名防守球员,防守球员只要碰到对方四分卫就算擒杀。
所有的球员都是一块连续的、不中空的2维区域。防守球员不可以从进攻锋线的身体上穿过,也不可以从界外穿过(只能走空地)。
防守队员不可以转动身体,只能平移。防守队员的身体所有部分向同一个方向(上、下、左、右)移动1格的过程叫做1步。

Input

输入包含多组数据。每组数据第一行都是两个整数H,W(0<H,W<=100),表示整个区域的高度和宽度,H=W=0表示输入结束。接下来有H行,每行W个字符。每个字符如果是’.’,表示这里是空地,如果是’O’,表示是进攻锋线队员的身体,如果是’D’,表示是准备擒杀的防守球员的身体,如果是’Q’,表示是四分卫的身体。
输入保证符合上面的条件。防守球员的身体总共不超过20格。

Output

对每组数据,输出包含擒杀所需最少步数的一行。如果不能擒杀,输出带’Impossible’的一行。

Sample Input

6 6

.Q....

QQ..OO

.OO..O

...O.O

OO.O..

....DD

7 7

.Q.....

QQ.OOO.

...O...

O......

OO..OO.

.O.....

.....DD

0 0

Sample Output

Impossible

9

题意: 用DD去抓QQ, QQ不动, DD是连体的,求解最少步骤

思路分析:

  因为有目标,而且求最低步骤,所以用bfs, 注意DD是连体的

# include <iostream>
# include <fstream>
# include <cstring>
# include <queue>
# include <vector>
using namespace std;
struct Info
{
    int x, y, jishu;
}info;
int m, n;
char map[101][101];
int is[101][101];
int dx[4] = {1,0,-1,0};
int dy[4] = {0,-1,0,1};

vector <Info> v;

int bfs();
bool border(Info & a)
{
    if(a.x >= 1 && a.x <= m && a.y >= 1 && a.y <= n)
    return true;
    return false;
}
int main()
{
    //fstream cin("aaa.txt");
    while(cin >> m >> n)
    {
        v.clear();
        if(m == 0 && n == 0) break;
        for(int i = 1; i <= m; i++)
            for(int j = 1; j <= n; j++)
            {
                cin >> map[i][j];
                if(map[i][j] == ‘D‘)
                {
                    info.x = i;
                    info.y = j;
                    info.jishu = 0;
                    v.push_back(info);
                }
            }
            int h = bfs();
            if(h < 0)
            cout << "Impossible" << endl;
            else
            cout << h << endl;
    }

    return 0;
}
int bfs()
{
    is[v[0].x][v[0].y] = 1;
    memset(is, 0, sizeof(is));
    queue <vector <Info> > Q;
    Q.push(v);
    vector <Info> now, next;
    while(!Q.empty())
    {
        now = Q.front();
        Q.pop();

        for(int i = 0; i < 4; i++)
        {
            next = now;
            next[0].jishu ++;

            for(int j = 0; j < next.size(); j++)
            {
                next[j].x = now[j].x + dx[i];
                next[j].y = now[j].y + dy[i];
            }
            int flag = 0;
            for(int j = 0; j < next.size(); j++)
            {
                if(!border(next[j]) || map[next[j].x][next[j].y] == ‘O‘)
                flag = 1;
               // cout << map[next[j].x][next[j].y];
            }
            //cout << endl;
            if(flag)
            continue;
            if(is[next[0].x][next[0].y])
            continue;
            for(int j = 0; j < next.size(); j++)
                if(map[next[j].x][next[j].y] == ‘Q‘)
                    return next[0].jishu;

            is[next[0].x][next[0].y] = 1;
            Q.push(next);
        }

    }
    return -1;

}
时间: 2024-10-14 09:08:30

HDU 搜索练习 Catch him的相关文章

HDU 搜索练习 Oil Deposits

Oil Deposits Time Limit : 2000/1000ms (Java/Other) Memory Limit : 65536/32768K (Java/Other) Total Submission(s) : 61 Accepted Submission(s) : 25 Problem Description The GeoSurvComp geologic survey company is responsible for detecting underground oil

HDU 搜索练习 连连看

连连看 Time Limit: 20000/10000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)Total Submission(s): 27989 Accepted Submission(s): 6952 Problem Description “连连看”相信很多人都玩过.没玩过也没关系,下面我给大家介绍一下游戏规则:在一个棋盘中,放了很多的棋子.如果某两个相同的棋子,可以通过一条线连起来(这条线不能经过其它棋子),而

HDU 搜索练习 The magic apple tree

The magic apple tree Time Limit : 3000/1000ms (Java/Other) Memory Limit : 65535/32768K (Java/Other) Total Submission(s) : 26 Accepted Submission(s) : 2 Problem Description Sailormoon girls all like eating many kinds of fruit, such as banana, grape, a

HDU 搜索练习 Red and Black

Red and Black Time Limit : 2000/1000ms (Java/Other) Memory Limit : 65536/32768K (Java/Other) Total Submission(s) : 23 Accepted Submission(s) : 13 Problem Description There is a rectangular room, covered with square tiles. Each tile is colored either

HDU 搜索练习 非常可乐

非常可乐 Time Limit : 2000/1000ms (Java/Other) Memory Limit : 32768/32768K (Java/Other) Total Submission(s) : 51 Accepted Submission(s) : 21 Problem Description 大家一定觉的运动以后喝可乐是一件很惬意的事情,但是seeyou却不这么认为.因为每次当seeyou买了可乐以后,阿牛就要求和seeyou一起分享这一瓶可乐,而且一定要喝的和seeyou一

HDU 搜索练习 Rescue

Rescue Time Limit : 2000/1000ms (Java/Other) Memory Limit : 65536/32768K (Java/Other) Total Submission(s) : 44 Accepted Submission(s) : 13 Problem Description Angel was caught by the MOLIGPY! He was put in prison by Moligpy. The prison is described a

HDU 搜索练习 Prime Ring Problem

Prime Ring Problem Time Limit : 4000/2000ms (Java/Other) Memory Limit : 65536/32768K (Java/Other) Total Submission(s) : 17 Accepted Submission(s) : 10 Problem Description A ring is compose of n circles as shown in diagram. Put natural number 1, 2, ..

HDU 搜索练习 N皇后问题

N皇后问题 Time Limit : 2000/1000ms (Java/Other) Memory Limit : 32768/32768K (Java/Other) Total Submission(s) : 39 Accepted Submission(s) : 18 Problem Description 在N*N的方格棋盘放置了N个皇后,使得它们不相互攻击(即任意2个皇后不允许处在同一排,同一列,也不允许处在与棋盘边框成45角的斜线上.<br>你的任务是,对于给定的N,求出有多少种合

[kuangbin带你飞]专题一 简单搜索 - C - Catch That Cow

1 #include<iostream> 2 #include<cstdio> 3 #include<string> 4 #include<vector> 5 #include<queue> 6 #include<cstring> 7 using namespace std; 8 int n, k, c, ans; 9 int num[100005]; 10 int main() 11 { 12 // freopen("in