题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=2531

题目大意: 你的身体占据多个点。每次移动全部的点,不能撞到障碍点,问撞到目标点块(多个点)的最少步数。

解题思路

挺有趣的一个题,每次要移动多个点。

如果只移动一个点,就是个简单粗暴的BFS。

多个点照样处理,读图的时候把扫到的第一个点当作移动点,然后vector记录下身体的其它点与该移动点的相对坐标。

BFS的时候,先看看移动点能不能动,然后再根据身体的相对坐标还原出身体的绝对坐标,看看有没有越界或是撞到障碍。

顺便检测一下是否撞到目标点。

#include "cstdio"
#include "iostream"
#include "cstring"
#include "queue"
#include "string"
#include "vector"
using namespace std;
struct status
{int x,y,dep;status(int x,int y,int dep):x(x),y(y),dep(dep) {}
};
char map[105][105];
int n,m,sx,sy,vis[105][105],dir[4][2]={-1,0,1,0,0,-1,0,1},ans;
vector<status> body;
void bfs(int sx,int sy)
{queue<status> Q;Q.push(status(sx,sy,0));vis[sx][sy]=true;bool flag=false;while(!Q.empty()){if(flag) break;status t=Q.front();Q.pop();//cout<<map[t.x][t.y]<<endl;for(int s=0;s<4;s++){int X=t.x+dir[s][0],Y=t.y+dir[s][1];if(vis[X][Y]||X<1||X>n||Y<1||Y>m||map[X][Y]=='O') continue;bool ok=true,get=false;for(int k=0;k<body.size();k++){int bx=X-body[k].x,by=Y-body[k].y;if(bx<1||bx>n||by<1||by>m||map[bx][by]=='O') {ok=false;break;}if(map[bx][by]=='Q') get=true;}if(!ok) continue;vis[X][Y]=true;if(get||map[X][Y]=='Q') {flag=true;ans=min(ans,t.dep+1);break;}Q.push(status(X,Y,t.dep+1));}}
}
int main()
{//freopen("in.txt","r",stdin);ios::sync_with_stdio(false);string tt;while(cin>>n>>m&&n){body.clear();memset(vis,0,sizeof(vis));bool first=false;ans=1<<28;for(int i=1;i<=n;i++){cin>>tt;for(int j=0;j<tt.size();j++){map[i][j+1]=tt[j];if(tt[j]=='D'){if(!first) {sx=i;sy=j+1;first=true;}else {body.push_back(status(sx-i,sy-(j+1),0));}}}}bfs(sx,sy);if(ans==1<<28) cout<<"Impossible"<<endl;else cout<<ans<<endl;}
}

11882814 2014-10-16 01:36:06 Accepted 2531 15MS 352K 1971 B C++ Physcal

转载于:https://www.cnblogs.com/neopenx/p/4027878.html

HDU 2531 (BFS搜索)相关推荐

  1. hiho_1139_二分+bfs搜索

    题目 给定N个点和M条边,从点1出发,到达点T.寻找路径上边的个数小于等于K的路径,求出所有满足条件的路径中最长边长度的最小值.  题目链接:二分      最小化最大值,考虑采用二分搜索.对所有的边 ...

  2. hdu 1226(bfs+同余剪枝)

    超级密码 Time Limit: 20000/10000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Total Sub ...

  3. HDU - 3571 HDU CakeMan(bfs+最短路必经点)

    题目链接:点击查看 题目大意:给出一个n*m的地图: 'D'表示小贩 'S'表示小贩的家 'C'表示城管 'X'表示墙 '.'表示路 '数字'表示小贩需要多停留几秒钟 现在城管发现了小贩,小贩会选择任 ...

  4. java灌水bfs二叉树,二叉树的BFS搜索

    本人需要阅读代码,如果觉得阅读困难可以一步到CSDN 代码中涉及到的通过先序遍历和中序遍历生成一条二叉树的算法,在本人的另一篇博客通过树的中序和先序遍历生成二叉树中进行了详细讲解. 广度优先搜索算法( ...

  5. 4. 对称飞行器 -- BFS搜索

    对称飞行器 小强在玩一个走迷宫的游戏,他操控的人物现在位于迷宫的起点,他的目标是尽快的到达终点. 每一次他可以选择花费一个时间单位向上或向下或向左或向右走一格,或是使用自己的对称飞行器花费一个时间单位 ...

  6. 【CCCC】L3-008 喊山 (30分),BFS搜索最长路,水题

    problem L3-008 喊山 (30分) 喊山,是人双手围在嘴边成喇叭状,对着远方高山发出"喂-喂喂-喂喂喂--"的呼唤.呼唤声通过空气的传递,回荡于深谷之间,传送到人们耳中 ...

  7. HDU - 2612 Find a way(BFS搜索)

    题目: 链接 思路: 用BFS分别以'Y'和'M'的位置为起点进行两次搜索,并把这两次的搜索结果在一个二维数组中保存下来,在对地图遍历遇到'@'更行最小值. PS: 如果用'Y'和'M'点分别去搜每个 ...

  8. HDU 2653 (记忆化BFS搜索+优先队列)

    题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=2653 题目大意:迷宫中有普通点和陷阱.其中普通点可以走可以飞,但是陷阱只能飞.走耗时1,飞耗时2.但 ...

  9. HDU 1026 广度优先搜索,BFS+路径的记录

    哎~~花了半天的时间写了一个DFS的程序,结果无情的limit time exceed,然后到网上搜了一下,居然用的是BFS 一般来说,广搜常用于找单一的最短路线,或者是规模小的路径搜索,它的特点是& ...

  10. Oil Deposits HDU - 1241 并查集思想 + bfs搜索

    题目 在第一次植物僵尸世界大战中,植物国的黑玫瑰王子使用了植物国的超超超超级无敌禁术-----"BUG",开启了异次元的大门,在一位超超超超-级的指挥官"辅助器" ...

最新文章

  1. R语言泊松回归模型案例:基于AER包的affair数据分析
  2. 特斯拉D1芯片遭实名diss:内存到封装都成问题,网友:反正不能公开测评
  3. join orcl的left_Oracle关联查询关于left/right join的那点事
  4. span 标记 width 设置
  5. matlab利用t-SNE实现高维数据可视化(tsne函数用法实例)
  6. firebird乱码问题
  7. phpcms v9模板制作教程
  8. 社会工程学利用的人性_社会工程学利用的人性弱点包括
  9. win10系统DPC_WATCHDOG_VIOLATION蓝屏靠谱解决办法
  10. java抢微博福卡,敬业福终极攻略:一天拿20多张福卡,轻松集齐支付宝五福
  11. 需要很多邮箱怎么办?分享几个不错的办法可无限安全生成多个邮箱
  12. kingbase之ksql命令工具
  13. ubuntu下安装google拼音输入法
  14. sklearn聚类之OPTICS算法
  15. python polygon_python Polygon模块安装
  16. 全球范围内12个典型区域提取(total runoff)
  17. 机器学习_BP神经网络——全网最全、最细公式推导
  18. 做电商需要注意什么?怎样才能做好云仓?
  19. Qt 杂记 —— Qt安装并配置调试文件,添加源码调试pdb文件
  20. 前端基础(八)_盒子模型(标准盒子模型和怪异盒子模型)

热门文章

  1. 页面右下角弹广告案例
  2. linux切换英文界面,linux英文界面下使用中文输入法
  3. Linux下Gogs二进制安装配置
  4. idea swagger生成接口文档_Springboot结合swagger-ui自动生成接口文档
  5. No package ‘mate-settings-daemon‘ found
  6. 管理新语:新员工进来,竟然连起码的技能培训都没有
  7. 没有用括号确定操作符的优先级顺序,导致错误一例
  8. Ribbon风格下,依然叫菜单或者菜单卡、菜单页
  9. LINUX SHELL中for用数组循环
  10. 想起JDK1.4的死机事故