CSU 1726: 你经历过绝望吗?两次!(bfs+优先队列)
传送门:
http://acm.csu.edu.cn/csuoj/problemset/problem?pid=1726
1726: 你经历过绝望吗?两次!
Submit Page Summary Time Limit: 1 Sec Memory Limit: 128 Mb Submitted: 859 Solved: 290
Description
Input
Output
一个整数,为最少拆毁的障碍物数量,如果不能逃离废墟,输出-1。
Sample Input
3
3 3
###
#@*
***
3 4
####
#@.*
**.*
3 3
.#.
#@#
.#.
Sample Output
1
0
-1
Hint
分析:
题目的衡量标准是拆除的障碍物的多少(可拆除的障碍物),而不是走的格子数目最少,
#include<stdio.h>
#include<iostream>
#include<memory.h>
#include<queue>
using namespace std;
int t,n,m;
#define max_v 105
char G[max_v][max_v];
int vis[max_v][max_v];
int dir[][]={{-, }, {, }, {, -}, {, }};//方向引导数组
int step;
int sx,sy;//起始位置
struct node
{
int x,y,step;
bool operator < (const node & p) const{
return step > p.step;
}
};
int bfs()
{
memset(vis,,sizeof(vis));
priority_queue<node> q;
node p,next; p.x=sx;
p.y=sy;
p.step=; vis[sx][sy]=; q.push(p); while(!q.empty())
{
p=q.top();
q.pop();
step=p.step; if(p.x==||p.x==n-||p.y==||p.y==m-)//到达了废墟外围
{
return step;
} for(int i=;i<;i++)
{
next.x=p.x+dir[i][];
next.y=p.y+dir[i][];
next.step=; if(next.x>=&&next.x<n&&next.y>=&&next.y<m)//在废墟内(包括外围)
{
if(G[next.x][next.y]=='*')//可拆除障碍
{
next.step=step+;
}else if(G[next.x][next.y]=='.')//平路
{
next.step=step;
}else //if(G[next.x][next.y]=='#') //不可拆除的障碍
{
next.step=-;
}
if(next.step>=&&vis[next.x][next.y]==)//可通行且没有走过
{
vis[next.x][next.y]=;//标记
q.push(next);
}
}
}
}
return -;
}
int main()
{
cin>>t;
while(t--)
{
cin>>n>>m;
for(int i=;i<n;i++)
{
for(int j=;j<m;j++)
{
cin>>G[i][j];
if(G[i][j]=='@')//找起始位置
{
sx=i;
sy=j;
}
}
}
printf("%d\n",bfs());
}
return ;
}
所以定义结构体的时候加一个拆除障碍物的记录,为了能求出最少的,就使用优先队
列,其他的就跟普通的bfs模板题没有什么区别
注意没有固定的终点,只要求走到废墟外面!
code:
CSU 1726: 你经历过绝望吗?两次!(bfs+优先队列)的更多相关文章
- CSUOJ 1726 你经历过绝望吗?两次!BFS+优先队列
Description 4月16日,日本熊本地区强震后,受灾严重的阿苏市一养猪场倒塌,幸运的是,猪圈里很多头猪依然坚强存活.当地15名消防员耗时一天解救围困的"猪坚强".不过与在废 ...
- CSU - 2031 Barareh on Fire (两层bfs)
传送门: http://acm.csu.edu.cn/csuoj/problemset/problem?pid=2031 Description The Barareh village is on f ...
- UVa 11624,两次BFS
题目链接:http://vjudge.net/contest/132239#problem/A 题目链接:https://uva.onlinejudge.org/external/116/11624. ...
- POJ 1475 Pushing Boxes 搜索- 两重BFS
题目地址: http://poj.org/problem?id=1475 两重BFS就行了,第一重是搜索箱子,第二重搜索人能不能到达推箱子的地方. AC代码: #include <iostrea ...
- HDU2612---(两次BFS)
Description Pass a year learning in Hangzhou, yifenfei arrival hometown Ningbo at finally. Leave Nin ...
- UVa 1599 Ideal Path (两次BFS)
题意:给出n个点,m条边的无向图,每条边有一种颜色,求从结点1到结点n颜色字典序最小的最短路径. 析:首先这是一个最短路径问题,应该是BFS,因为要保证是路径最短,还要考虑字典序,感觉挺麻烦的,并不好 ...
- UVA 11624 Fire!(两次BFS+记录最小着火时间)
题目链接:https://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_problem ...
- hihocoder#1050 : 树中的最长路(树中最长路算法 两次BFS找根节点求最长+BFS标记路径长度+bfs不容易超时,用dfs做TLE了)
#1050 : 树中的最长路 时间限制:10000ms 单点时限:1000ms 内存限制:256MB 描述 上回说到,小Ho得到了一棵二叉树玩具,这个玩具是由小球和木棍连接起来的,而在拆拼它的过程中, ...
- Fire! UVA - 11624 (两步bfs)
题目链接 题意 人要从迷宫走出去,火会向四个方向同时扩散 分析 两步bfs,先出火到达各地时的时间(设初始时间为0,人每走一步为1s,在着一步内火可以向四周可触及的方向同时扩散),然后在bfs人,人能 ...
随机推荐
- 建一个springboot项目
1.打开 https://start.spring.io/ 新建一个maven的demo,这里选择的是1.5.18的版本 2.将自动生成的demo导入eclipse,直接选中File里的import, ...
- EasyUI datebox 日期范围 日期关联
jQuery EasyUI 1.4.5 html: <label>提交日期:</label> <input id="startDate" name=& ...
- 重构指南 - 分解复杂判断(Remove Arrowhead Antipattern)
当代码中有多层嵌套时,会降低代码的可读性,对于以后的修改也增加难度,所以我们需要分解复杂的判断并尽快返回. 重构前代码 public class Security { public ISecurity ...
- 通过mysql自动同步redis
在服务端开发过程中,一般会使用MySQL等关系型数据库作为最终的存储引擎,Redis其实也可以作为一种键值对型的数据库,但在一些实际场景中,特别是关系型结构并不适合使用Redis直接作为数据库.这俩家 ...
- 从Pc转向H5开发遇到的适配问题思考
1.首先说滚动条 移动端开发在不设置任何适配和viewport宽度的情况下,以iphone5为例:屏幕界面的逻辑分辨率是320x568,在谷歌浏览器的界面下屏幕的可视宽度是980px(谷歌设置的,每个 ...
- 模块与包&常用模块
一.模块的使用 模块定义:一系列功能的集合体 分为三大类:1.自定义模块 2.内置模块(比如 time,os,sys) 3.第三方模块 模块的表现形式: 1.使用python编写的py文件 2.已被编 ...
- 本地存储localStroage的用法及示例
localStorage是HTML5在在客户端存储数据的新方法,存储的数据没有时间限制. localStorage的主要API: localStorage.setItem(key,value); ...
- 【Python之搜索引擎】(一)概述
learning goal--search engine 1.Find datas - crawl 2.Index 3.page rank String操作 提取网络中的链接 Extracting a ...
- qt中qlineedit和qtextedit右键菜单翻译成中文
没有linguist和lupdate等命令需要安装Linguist: 在Terminal中输入: sudo apt-get install qt4-dev-tools qt4-doc qt4-qtco ...
- c 读取整个文件内容
char* textFileRead(char* filename){char* text;FILE *pf = fopen(filename,"r");fseek(pf,0,SE ...