题目链接:http://lightoj.com/volume_showproblem.php?problem=1377

思路:这道题只要处理好遇到"*"这种情况就可以搞定了。我们可以用一个vector向量来记录所有的“*”,然后用一个3维数组来判重,并且对于每个状态都加一个标记,判断是否需要立刻转移,值得注意的是转移过后,vector应该立刻清空。

 #include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <vector>
#include <queue>
using namespace std; const int MAXN = ( + );
const int inf = ( << );
int n,m,ans;
char map[MAXN][MAXN];
vector<pair<int, int> >vet; struct Node{
int x, y, step, pre;
bool operator < (const Node &p ) const {
return p.step < step;
}
}st; bool mark[MAXN][MAXN][];
int dir[][]={{,-},{,},{-,},{,}}; void bfs()
{
memset(mark, false, sizeof(mark));
priority_queue<Node >que;
que.push(st);
mark[st.x][st.y][]=true;
while(!que.empty()){
Node q, p = que.top();
que.pop();
if(map[p.x][p.y] == 'D'){
ans = p.step;
return ;
}
if(map[p.x][p.y] == '*'){
bool flag = false;
for(int i = ; i < (int)vet.size(); i++){
pair<int, int>pp = vet[i];
if(pp.first == p.x&&pp.second == p.y){
flag = true;
continue;
}
if(!mark[pp.first][pp.second][]){
mark[pp.first][pp.second][] = true;
Node tmp;
tmp.x = pp.first, tmp.y = pp.second, tmp.step = p.step + , tmp.pre = ;
que.push(tmp);
}
}
vet.clear();
if(flag)vet.push_back(make_pair(p.x,p.y));
if(p.pre == )continue;
}
for(int i = ; i < ; i++){
q.x = p.x + dir[i][];
q.y = p.y + dir[i][];
if(map[q.x][q.y] == '#')continue;
if(!mark[q.x][q.y][]){
mark[q.x][q.y][] = true;
q.step = p.step + ;
q.pre = ;
que.push(q);
}
}
}
} int main()
{
int _case,t=;
scanf("%d",&_case);
while(_case--){
vet.clear();
scanf("%d%d",&n,&m);
for(int i=; i<=n; i++){
scanf("%s", map[i] + );
for(int j=; j<=m; j++){
if(map[i][j] == 'P'){
st.x = i, st.y = j, st.step = , st.pre = ;
}else if(map[i][j] == '*') {
vet.push_back(make_pair(i,j));
}
}
}
ans = inf;
bfs();
printf("Case %d: ", t++);
if(ans == inf){
puts("impossible");
}else
printf("%d\n",ans);
}
return ;
}

loj 1377 (bfs)的更多相关文章

  1. loj 1185(bfs)

    题目链接:http://acm.hust.edu.cn/vjudge/problem/viewProblem.action?id=26898 思路:我们可以给定有直接边相连的两点的距离为1,那么就是求 ...

  2. loj 1165(bfs+康托展开)

    题目链接:http://acm.hust.edu.cn/vjudge/problem/viewProblem.action?id=26879 思路:题目意思很简单,就是通过一些位置的交换,最后变成有序 ...

  3. loj 1055(bfs)

    题目链接:http://acm.hust.edu.cn/vjudge/problem/viewProblem.action?id=26772 思路:注意判重就行,开个6维数组记录3个robots的位置 ...

  4. loj 1426(dfs + bfs)

    题目链接:http://lightoj.com/volume_showproblem.php?problem=1426 思路:首先我们预处理出每一个"*"在某一方向上最终能到达的位 ...

  5. loj 1046(bfs)

    题目链接:http://acm.hust.edu.cn/vjudge/problem/viewProblem.action?id=26766 思路:由于数据不是很大,我们可以枚举骑士最后聚集的位置,然 ...

  6. LOJ 3057 「HNOI2019」校园旅行——BFS+图等价转化

    题目:https://loj.ac/problem/3057 想令 b[ i ][ j ] 表示两点是否可行,从可行的点对扩展.但不知道顺序,所以写了卡时间做数次 m2 迭代的算法,就是每次遍历所有不 ...

  7. 「LOJ#6121」「网络流 24 题」孤岛营救问题(BFS

    题目描述 1944 年,特种兵麦克接到国防部的命令,要求立即赶赴太平洋上的一个孤岛,营救被敌军俘虏的大兵瑞恩.瑞恩被关押在一个迷宫里,迷宫地形复杂,但幸好麦克得到了迷宫的地形图.迷宫的外形是一个长方形 ...

  8. LOJ #2877. 「JOISC 2014 Day2」交朋友 并查集+BFS

    这种图论问题都挺考验小思维的. 首先,我们把从 $x$ 连出去两条边的都合并了. 然后再去合并从 $x$ 连出去一条原有边与一条新边的情况. 第一种情况直接枚举就行,第二种情况来一个多源 bfs 即可 ...

  9. LOJ #2876. 「JOISC 2014 Day2」水壶 BFS+最小生成树+倍增LCA

    非常好的一道图论问题. 显然,我们要求城市间的最小生成树,然后查询路径最大值. 然后我们有一个非常神的处理方法:进行多源 BFS,处理出每一个城市的管辖范围. 显然,如果两个城市的管辖范围没有交集的话 ...

随机推荐

  1. 开源工作流 Bonita BPM (JAVA)

    Bonita BPM 开源工作流 Bonita BPM  (JAVA) http://www.bonitasoft.com/

  2. ABAP 内表的行列转换-发货通知单-SLIS

    REPORT Z_TEST_COL_TO_ROW. TYPE-POOLS: slis. TABLES: VTTP,LIPS,LIKP,KNA1 ,VTTK. DATA: gd_fieldcat TYP ...

  3. [Android]drawable-nodpi文件夹 的作用

    把一些不能被拉伸的图片放在 drawable-nodpi 中,此图片将不会被放大,以原大小显示. 看下图: 这两个图片被放到了drawable-nodpi 中 在不同分辨率下的显示大小是一样的,不会被 ...

  4. ubuntu mysql 安装和外网访问配置

    1.输入 sudo apt-get install mysql-server 安装过程中会让你输入密码,这个密码是root的密码. 安装完毕后,就可以正常使用了,如果你需要外网用户能够连接继续下面的步 ...

  5. Effective C++ -----条款32:确定你的public继承塑模出is-a关系

    “public继承”意味is-a.适用于base classes身上的每一件事情一定也适用于derived classes身上,因为每一个derive class对象也都是一个base class对象 ...

  6. JqueryUI学习笔记-自动完成autocomplete

    <!DOCTYPE html><html><head><meta charset="UTF-8"><title>Inse ...

  7. 一个servlet处理来自多个不同页面的请求!

    例如有一个用户表,我们要处理 添加,删除 用户以及登录功能 对应的有add.jsp del.jsp login.jsp等 <body> <!-- login.jsp --> & ...

  8. osg四元数设置roll pitch heading角度

    roll绕Y轴旋转 pitch绕X轴旋转 heading绕Z轴旋转 单位是弧度,可以使用osg::inDegrees(45)将45角度转换为弧度 定义一个四元数 osg::Quat q( roll,o ...

  9. 关闭Eclipse的控制台console自动跳出

    一.背景 在eclipse中进行开发,尤其是在后台有项目运行的时候,当有log或者错误需要打印到console中时,控制台就会被自动弹出,恰好这时候你又在编写代码,就会感觉瞬间想杀人,下面我们就来分享 ...

  10. 解决spring+shiro cacheManager 登录报错

    一.项目启动,登录报错 org.springframework.beans.factory.BeanCreationException: Error creating bean with name ' ...