Catch him

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

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
Source
The 6th UESTC Programming Contest
Recommend
lcy   |   We have carefully selected several similar problems for you:  3500 2821 1983 2822 2782 
我就说我广搜没问题,真是一道好题,移动的不是一个点,是一片区域,代码注释的很详细,附代码:
#include<stdio.h>
#include<string.h>
#include<queue>
#include<algorithm>
using namespace std;
char map[110][110];
int vis[110][110],i,j,k,l,m,n,len,ll;
struct node
{int x;int y;int step;
}start;
struct nod//储存其余点相对于首点的位置
{int vx;int vy;
} t[100];
int dx[]={1,0,-1,0};
int dy[]={0,-1,0,1};
int judge(int x,int y)
{if(x<0||x==m||y<0||y==n||map[x][y]=='O')return 0;return 1;
}
int bfs()
{memset(vis,0,sizeof(vis));node team;queue<node > q;//构建队列
//  while(q.empty())//清空队列 //q.pop();q.push(start);//起点进队列 vis[start.x][start.y]=1;//表示起点已经走过,不需要再走 while(!q.empty()){node p;p=q.front();q.pop();for(i=0;i<4;i++)//搜索四个方向 {team=p;team.step++;team.x+=dx[i];//搜索下一个点 team.y+=dy[i];for(j=0;j<len;j++)//从该点开始原样复制防守队员所占的块列 {if(judge(team.x+t[j].vx,team.y+t[j].vy)==0)//如果有一点不符合 break;}if(j!=len)//那么该点就不能走 continue;if(vis[team.x][team.y])//表示当前点已经可以走了,判断是不是走过了; continue;for(j=0;j<len;j++)//如果当前点可以走,并且没有走过 if(map[team.x+t[j].vx][team.y+t[j].vy]=='Q')//复制出来的防守队员的块列上只要有一点 return team.step;//碰住了四分卫的身体,就输出答案 vis[team.x][team.y]=1;q.push(team);}}return -1;
}
int main()
{while(scanf("%d%d",&m,&n),m+n){for(i=0;i<m;i++)scanf("%s",map[i]);len=0;int flag=0;for(i=0;i<m;i++)//找到第一个点 {for(j=0;j<n;j++){if(map[i][j]=='D'){flag=1;start.x=i;start.y=j;break;}}if(flag)break;}start.step = 0;for(i=0;i<m;i++)for(j=0;j<n;j++){if(map[i][j]=='D'){t[len].vx=i-start.x;//找其他点相对第一点的位置 t[len++].vy=j-start.y;}}int ans=bfs();if(ans<0)printf("Impossible\n");elseprintf("%d\n",ans);}return 0;
}

杭电2531Catch him相关推荐

  1. 【杭电ACM】1097 A hard puzzle

    [杭电ACM]1097  A hard puzzle http://acm.hdu.edu.cn/showproblem.php?pid=1097 先用int手写了算法结果竟然wrong answer ...

  2. 【ACM】杭电OJ 1106 函数atoi

    函数atoi是把字符串转化成整数的函数,头文件为 #include "stdlib.h" e.g. 运行环境:Dev-C++ 5.11 杭电1106 调用了sort函数,运行的时间 ...

  3. 【ACM】杭电OJ 2037

    题目链接:杭电OJ 2037 先把b[i]进行排序,然后,b[i]与a[i+1]进行比较. #include <iostream> #include <cstdio> #inc ...

  4. 【ACM】杭电OJ 2020(排序)

    题目链接:杭电OJ 2020 排序可以有冒泡排序,选择排序,或者直接调用函数. 下面是选择排序: #include <stdio.h> #include <math.h> in ...

  5. 【ACM】杭电OJ 2018

    题目链接:杭电OJ 2018 从n>4开始,每一年的牛的数量=前一年的牛的数量+三年前的牛的数量 问:为什么是三年前? 答:假设三年前有一头小牛出生,出生的那一年即为第一年,到了第四年,即三年后 ...

  6. 【ACM】杭电OJ 1005

     题目链接:杭电OJ 1005 超时代码如下(而且开辟的数组空间大小不够): #include <stdio.h> int m[100000]; int f(int n,int a,int ...

  7. 【ACM】杭电OJ 1004

     题目链接:杭电OJ 1004 运行环境:Dev-C++ 5.11 思路: 先把先把num数组全部赋值为1:第一个颜色单独输入,从第二个开始,需要与前面的进行比较,如果前面有相同的颜色,则在目前的nu ...

  8. 【ACM】杭电OJ 2012。

    题目链接:杭电OJ 2012 思路很简单,但是有一种高效算法显示编译错误,不知道为什么 运行环境:VS2017 AC代码: #include <stdio.h> #include < ...

  9. 【ACM】杭电OJ 1003。

    运行环境VS2017  题目链接:杭电OJ 1003 主要思想是: 用d[i]来存放前i项中最大的和,得到end,然后再倒推,得起始的位置begin 然而在程序42行的疑问,大家可以讨论一下吗???? ...

最新文章

  1. 应用内设置语言不重启方法
  2. RabbitMQ之与Spring集成
  3. 10.1.5 布局优化利器之 Hierarchy Viewer
  4. 二十五:设计模式的总结
  5. JSR 303约束规则
  6. 跟着微信后台团队学习分布式一致性协议
  7. php里的抽象类和接口
  8. zoj 2526(一道很好的最短路应用题)
  9. 用css 添加手状样式,鼠标移上去变小手,变小手
  10. 匹马行天下之思维决定高度篇——编程“价”更高
  11. oracle:sql介绍及SQL基本查询 lt;四gt;
  12. 后台开发笔记-在服务器上运行java后台项目
  13. [vm] vm安装xp :non-bootable disk 80 解决办法
  14. 第三阶段应用层——1.4 数码相册—FreeType介绍
  15. Python(贪心算法)问题 D: 删数问题_输入一个高精度的正整数N,去掉其中任意S个数字后剩下的数字按原左右次序组成一个新的正整数。
  16. 遍历指定文件夹下的所有文件名
  17. 用java做出长方体的表面积_编写java程序,输入一个长方体的长、宽、高,求长方体的表面积和体积,并将结果显示,一个长方体的...
  18. linux 网络冲浪,命令行下的网络冲浪工具命令行浏览器介绍
  19. csp试题2:ISBN号码
  20. kafka使用教程、快速上手

热门文章

  1. linux下service+命令和直接去执行命令的区别,怎么自己建立一个service启动
  2. [docker]docker run指定entrypiont
  3. SpringMVC 过滤非法字符
  4. VC“cannot execute program”错误的解决方法
  5. nodejs学习文档(一) 认识node.js
  6. windows cab文件安装
  7. BugkuCTF 你必须让他停下
  8. Windows Phone 8 与 windows 8 开发技术概览
  9. zabbix服务器搭建
  10. python 连接MS sql server2005数据库