loj 1377 (bfs)
题目链接: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)的更多相关文章
- loj 1185(bfs)
题目链接:http://acm.hust.edu.cn/vjudge/problem/viewProblem.action?id=26898 思路:我们可以给定有直接边相连的两点的距离为1,那么就是求 ...
- loj 1165(bfs+康托展开)
题目链接:http://acm.hust.edu.cn/vjudge/problem/viewProblem.action?id=26879 思路:题目意思很简单,就是通过一些位置的交换,最后变成有序 ...
- loj 1055(bfs)
题目链接:http://acm.hust.edu.cn/vjudge/problem/viewProblem.action?id=26772 思路:注意判重就行,开个6维数组记录3个robots的位置 ...
- loj 1426(dfs + bfs)
题目链接:http://lightoj.com/volume_showproblem.php?problem=1426 思路:首先我们预处理出每一个"*"在某一方向上最终能到达的位 ...
- loj 1046(bfs)
题目链接:http://acm.hust.edu.cn/vjudge/problem/viewProblem.action?id=26766 思路:由于数据不是很大,我们可以枚举骑士最后聚集的位置,然 ...
- LOJ 3057 「HNOI2019」校园旅行——BFS+图等价转化
题目:https://loj.ac/problem/3057 想令 b[ i ][ j ] 表示两点是否可行,从可行的点对扩展.但不知道顺序,所以写了卡时间做数次 m2 迭代的算法,就是每次遍历所有不 ...
- 「LOJ#6121」「网络流 24 题」孤岛营救问题(BFS
题目描述 1944 年,特种兵麦克接到国防部的命令,要求立即赶赴太平洋上的一个孤岛,营救被敌军俘虏的大兵瑞恩.瑞恩被关押在一个迷宫里,迷宫地形复杂,但幸好麦克得到了迷宫的地形图.迷宫的外形是一个长方形 ...
- LOJ #2877. 「JOISC 2014 Day2」交朋友 并查集+BFS
这种图论问题都挺考验小思维的. 首先,我们把从 $x$ 连出去两条边的都合并了. 然后再去合并从 $x$ 连出去一条原有边与一条新边的情况. 第一种情况直接枚举就行,第二种情况来一个多源 bfs 即可 ...
- LOJ #2876. 「JOISC 2014 Day2」水壶 BFS+最小生成树+倍增LCA
非常好的一道图论问题. 显然,我们要求城市间的最小生成树,然后查询路径最大值. 然后我们有一个非常神的处理方法:进行多源 BFS,处理出每一个城市的管辖范围. 显然,如果两个城市的管辖范围没有交集的话 ...
随机推荐
- python to be linux daemon
所需第三方库:python-daemon[https://pypi.python.org/pypi/python-daemon/] 使用方式: python linux_service.py star ...
- nginx server中的server_name配置的域名在客户机上无法访问
nginx配置如下: nginx.conf: #user nobody; worker_processes 2; #error_log logs/error.log; #error_log logs/ ...
- linux日常小坑
一.权限 1.文件权限 改动文件权限和所有权的命令有如下两个: chmod -更改权限 chown -更改所有权 不过,只有用户是当前所有者或者根用户,才能实际更改文件的权限或所有权,这一点大家要注意 ...
- DELPHI控件:DBLookupComboBOX组件的使用方法
在许多数据表中,数据是以代码方式存放的,如在班级编码数据表tB03(表5.5)中,系部字段TB0309采用编码方式存放,系部真实名称则存放在系部编码表TB06.使用代码的好处是,用户可在编码表TB06 ...
- ACM/ICPC 之 数据结构-邻接表+DP+队列+拓扑排序(TSH OJ-旅行商TSP)
做这道题感觉异常激动,因为在下第一次接触拓扑排序啊= =,而且看了看解释,猛然发现此题可以用DP优化,然后一次A掉所有样例,整个人激动坏了,哇咔咔咔咔咔咔咔~ 咔咔~哎呀,笑岔了- -|| 旅行商(T ...
- August 19th 2016 Week 34th Friday
Friends are not the people you meet at the top, they are the people who were with you at the bottom. ...
- 在web.xml中classpath和classpath*的区别
classpath 和 classpath* 区别: classpath:只会到你指定的class路径中查找找文件; classpath*:不仅包含class路径,还包括jar文件中(class路径) ...
- 清除Windows系统桌面快捷方式小箭头
清除Windows桌面快捷方式小箭头,需要重启,且不会导致软件无法锁定到任务栏.新建.reg的注册表文件,命名随意,内容如下: Windows Registry Editor Version 5.00 ...
- springmvc中RedirectAttributes的作用
RedirectAttributes在重定向的时候可以传参,不能跨站传参,因为参数是保存在服务器端
- Loadrunner11.0 录制手机App脚本的方法
使用Loadrunner录制手机终端App脚本 1. 说明 目前手机APP上的功能日益丰富,对手机应用功能的性能测试需求也越来越多.公司比较抠门没有花钱买Loadrunner,可怜我们工作中一直用的破 ...