题目链接: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. oracle11g 连接问题

    一.The Network Adapter could not establish the connection  状态: 失败 -测试失败: IO 错误: The Network Adapter c ...

  2. Robot Framework + Selenium2Library环境下,结合Selenium Grid实施分布式自动化测试

    最近一段时间,公司在推行自动化测试流程,本人有幸参与了自定义通用控件的关键字封装和脚本辅助编写.数据驱动管理.测试用例执行管理等一系列工具软件的研发工作,积累了一些经验,在此与大家做一下分享,也算是做 ...

  3. 6.nodejs权威指南--进程

    1. 进程 var net = require('net'); var cluster = require('cluster'); cluster.setupMaster({ exec:'child. ...

  4. nyoj130 相同的雪花

    相同的雪花 时间限制:1000 ms  |  内存限制:65535 KB 难度:4   描述 You may have heard that no two snowflakes are alike. ...

  5. BM算法和Sunday快速字符串匹配算法

    BM算法研究了很久了,说实话BM算法的资料还是比较少的,之前找了个资料看了,还是觉得有点生涩难懂,找了篇更好的和算法更好的,总算是把BM算法搞懂了. 1977年,Robert S.Boyer和J St ...

  6. 【leetcode】Set Matrix Zeroes(middle)

    Given a m x n matrix, if an element is 0, set its entire row and column to 0. Do it in place. 思路:不能用 ...

  7. sql的优化相关问题

    这篇文章写的真心不错,值得仔细拜读,所以将其转载过来了. 一.             分析阶段 一 般来说,在系统分析阶段往往有太多需要关注的地方,系统各种功能性.可用性.可靠性.安全性需求往往吸引 ...

  8. C++多线程编程(入门实例)

    多线程在编程中有相当重要的地位,我们在实际开发时或者找工作面试时总能遇到多线程的问题,对多线程的理解程度从一个侧面反映了程序员的编程水平. 其实C++语言本身并没有提供多线程机制(当然目前C++ 11 ...

  9. ld: framework not found AGCommon 关于三方库到入 问题解决方案!!

    ld: framework  not found AGCommon clang:error:linker command failed with exit code 1 (use -v to see ...

  10. FragmentPagerAdapter实现刷新

    在fragmentpageadapter的instantiateItem方法里,他会先去FragmentManager里面去查找有没有相关的fragment如果有就直接使用如果没有才会触发fragme ...