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

him" title="Catch him">

对防守方来说,攻击对手的四分卫当然是最直接的限制对手进攻的方法。如果效果好,就可以在对方四分卫传球之前将其按翻在地,称之为擒杀。擒杀是最好的鼓舞防守队士气的方法,因为对方连传球的机会都没有,进攻就结束了,还必须倒退一些距离开球。凶狠的擒杀甚至能够将对方的四分卫弄伤,从而迫使对方更换这个进攻核心。

在本题中,输入给出准备擒杀四分卫的防守球员的位置、对方每个进攻锋线球员的位置以及对方四分卫的位置,你的任务是求出这名准备擒杀的防守球员至少要移动多少步,才能够擒杀对方四分卫。

假设对方进攻锋线和四分卫在这个过程中都不会移动。只有1名防守球员,防守球员只要碰到对方四分卫就算擒杀。

所有的球员都是一块连续的、不中空的2维区域。防守球员不可以从进攻锋线的身体上穿过,也不可以从界外穿过(只能走空地)。

防守队员不可以转动身体,只能平移。防守队员的身体所有部分向同一个方向(上、下、左、右)移动1格的过程叫做1步。

Input
输入包含多组数据。每组数据第一行都是两个整数H,W(0<=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
题意:求防守者到达四分卫位置的最少路线;
解题思路:这个题最大的问题就是防守者不是一个人,而是一片,搜索的时候将防守者头名看作整体,在判断的时候需要将防守者的身体展开,其他的没什么;
感悟:一下午就写了这一个,老是错真费劲。。。。55555;
代码:
#include

#include

#include

#include

#define maxn 110

using namespace std;

int visit[maxn][maxn],h,w,j,t=0,s=0;//s用来记录防守者的身体

int sx,sy;

char mapn[maxn][maxn];

int dir[maxn][maxn]={{1,0},{-1,0},{0,1},{0,-1}};

struct node

{

    int x;

    int y;

    int
step;

};

node start;

struct nod

{

    int
vx;

    int
vy;

};//记录防守队员的身体相对与首点的位置

nod no[maxn];

int check(int x,int y)

{

   
if(mapn[x][y]=='O'||x<1||x>h||y<1||y>w)

       
return 1;

    return
0;

}

int bfs()

{

   
memset(visit,0,sizeof(visit));

    node
a;

   
queueQ;

   
Q.push(start);

   
visit[start.x][start.y]=1;

   
while(!Q.empty())

    {

       
node fr;

       
fr=Q.front();

       
Q.pop();

       
for(int i=0;i<4;i++)

       
{

           
a=fr;

           
a.step++;

           
a.x+=dir[i][0];

           
a.y+=dir[i][1];

           
for(j=0;j

           
{

               
if(check(a.x+no[j].vx,a.y+no[j].vy))

               
break;

           
}

           
if(j!=s)

               
continue;//下一步没法盛开防守者的身体

           
if(visit[a.x][a.y])

               
continue;

           
for(j=0;j

               
if(mapn[a.x+no[j].vx][a.y+no[j].vy]=='Q')

                   
return a.step;

           
visit[a.x][a.y]=1;

           
Q.push(a);

       
}

    }

    return
-1;

}

int main()

{

   
//freopen("in.txt", "r", stdin);

   
while(~scanf("%d%d\n",&h,&w)&&h&&w)

    {

       
s=t=0;

       
for(int i=1;i<=h;i++)

       
{

           
for(int j=1;j<=w;j++)

           
{

               
scanf("%c",&mapn[i][j]);

           
}

           
scanf("\n");

       
}

       
for(int i=1;i<=h;i++)

           
for(int j=1;j<=w;j++)

               
if(mapn[i][j]=='D')

               
{

                   
start.x=i;

                   
start.y=j;

                   
break;

               
}

      
for(int i=1;i<=h;i++)

     
for(j=1;j<=w;j++)

     
{

         
if(mapn[i][j]=='D')

      
{

          
no[s].vx=i-start.x;//找其他点相对第一点的位置

       
no[s++].vy=j-start.y;

      
}

     
}

      
int ans=bfs();

      
//printf("ans=%d\n",ans);

      
if(ans<0)

           
printf("Impossible\n");

      
else

           
printf("%d\n",ans);

    }

}
Sample Output
Impossible
9

最新文章

  1. 解读ASP.NET 5 &amp; MVC6系列(16):自定义View视图文件查找逻辑
  2. Ie8+,强制默认使用ie8模式
  3. Win8.1 安装Express 框架
  4. js蛋疼的Class(获取class对象)
  5. 『转载』使用TortoiseSVN客户端
  6. Java Hour 60 逃不开的GC
  7. mina学习(一)
  8. HDU 4619 Warm up 2(2013多校2 1009 二分匹配)
  9. mysql sql灵活运用
  10. Interleaving String——Leetcode
  11. hdu 1548 A strange lift (bfs)
  12. YYLabel 自动布局 富文本文字点击事件
  13. 程序设计入门——C语言 习题汇总
  14. vue3+typescript引入外部文件
  15. Excel技巧--单列变多行
  16. dubbo使用简介
  17. URL的应用
  18. python中string格式化
  19. 如何实现一个IOS网络监控组件
  20. C# 解决窗体假死的状态

热门文章

  1. Oracle 每隔5分钟产生2个clsc*.log文件
  2. windows7下MongoDB(V3.4)的使用及仓储设计
  3. 第4章 同步控制 Synchronization ----事件(Event Objects)
  4. handlebar JS模板使用笔记
  5. php里的抽象类和接口
  6. python之控制台(console)颜色显示
  7. HDU1212
  8. 图片载入状态判断及实现百分比效果loading
  9. Django自定义过滤器中is_safe和need_autoescape两个参数的理解
  10. 【完美解决】2017打开MVC 4项目,cshtml页面提示‘当前上下文不存在名称model’