F - 你经历过绝望吗?两次!

Time Limit:1000MS     Memory Limit:131072KB     64bit IO Format:%lld & %llu

Submit Status Practice CSU 1726

Description

4月16日,日本熊本地区强震后,受灾严重的阿苏市一养猪场倒塌,幸运的是,猪圈里很多头猪依然坚强存活。当地15名消防员耗时一天解救围困的“猪坚强”。不过与在废墟中靠吃木炭饮雨水存活36天的中国汶川“猪坚强”相比,熊本的猪可没那么幸运,因为它们最终还是没能逃过被送往屠宰场的命运。
我们假设“猪坚强”被困在一个N*M的废墟中,其中“@”表示“猪坚强”的位置,“.”表示可以直接通过的空地,“#”表示不能拆毁的障碍物,“*”表示可以拆毁的障碍物,那么请问消防员至少要拆毁多少个障碍物,才能从废墟中救出“猪坚强”送往屠宰场?(当“猪坚强”通过空地或被拆毁的障碍物移动到废墟边缘时,视作被救出废墟)

Input

多组数据,第一行有一个整数T,表示有T组数据。(T<=100)
以下每组数据第一行有两个整数N和M。(1<=N,M<=100)
接着N行,每行有一个长度为M的字符串。

Output

一个整数,为最少拆毁的障碍物数量,如果不能逃离废墟,输出-1。

Sample Input

3
3 3
###
#@*
***
3 4
####
#@.*
**.*
3 3
.#.
#@#
.#.

Sample Output

1
0
-1

题意:
找出一条最短的路出到边界。
思路:
这题一开始以为不会超时,结果写完给你一个TLE,最后想到,bfs是以次数为关键的,而且之所以超时是因为我拓展的枝条太多了,而且有些路是重复走的,所以记录一下每个地方最快到达就行了,如果大于最小值,我不如直接在最小值拓展,还用你绕路走的路吗。

AC代码:

#include<iostream>
#include<set>
#include<map>
#include<cstdio>
#include<string>
#include<cstring>
#include<algorithm>
#include<queue>
using namespace std;
const int INF=0x3f3f3f3f;
typedef long long LL;
const int N=100000+1000;
#define T 100+50
int r,c,ans,tarx,tary;
char s[T][T];
int fx[][2] = {{1,0},{0,1},{-1,0},{0,-1}};struct node
{int x,y,cnt;node(){}node(int _1,int _2,int _3):x(_1),y(_2),cnt(_3){}bool operator<(const node& b)const{return cnt>b.cnt;}
};
priority_queue<node> q;void BFS()
{map< pair<int,int>,int > mp;while(!q.empty())q.pop();q.push(node(tarx,tary,0));mp[make_pair(tarx,tary)] = 0;node p;while(!q.empty()){p = q.top();q.pop();if(p.x==0||p.x==r-1||p.y==0||p.y==c-1){ans = p.cnt;break;}for(int i=0;i<4;++i){int tx=p.x+fx[i][0],ty=p.y+fx[i][1];bool flag = false;pair<int,int> pir(tx,ty);if(tx>=0&&tx<r&&ty>=0&&ty<c&&s[tx][ty]!='#'){int tmp = 0;if(mp.count(pir)!=0)flag=true;if(s[tx][ty]=='*')tmp++;if(mp[pir]>p.cnt+1||!flag)q.push(node(tx,ty,p.cnt+tmp)),mp[pir]=p.cnt+tmp;}}}
}int main()
{
#ifdef cdzscfreopen("in.txt","r",stdin);
#endifint n,m,i,j,k;scanf("%d",&n);while(n--){ans = INF;scanf("%d%d",&r,&c);for(i=0;i<r;++i){for(j=0;j<c;++j){scanf(" %c",&s[i][j]);if(s[i][j]=='@'){tarx = i;tary = j;}}}BFS();if(ans==INF)ans=-1;printf("%d\n",ans);}return 0;
}

CSU 1726-你经历过绝望吗?两次!(BFS+剪枝)相关推荐

  1. CSU 1726: 你经历过绝望吗?两次!

    题目传送门 平常不是很喜欢用 cin 和 cout 的,但是不知道为什么 scanf 就W了,cin 就 A了 ,应该是数据格式问题吧 代码: #include<cstdio> #incl ...

  2. CSUOJ 1726 你经历过绝望吗?两次!(BFS + 优先队列)

    1726: 你经历过绝望吗?两次! Description 4月16日,日本熊本地区强震后,受灾严重的阿苏市一养猪场倒塌,幸运的是,猪圈里很多头猪依然坚强存活.当地15名消防员耗时一天解救围困的&qu ...

  3. CSU 1726:你经历过绝望吗?两次! (BFS+优先队列)

    你经历过绝望吗?两次! Time limit:1000 ms Memory limit:131072 kB OS:Windows Problem Description 4月16日,日本熊本地区强震后 ...

  4. UVa 11624,两次BFS

    题目链接:http://vjudge.net/contest/132239#problem/A 题目链接:https://uva.onlinejudge.org/external/116/11624. ...

  5. Fire!——两个BFS

    [题目描述] [题目分析] 看到题目后很清楚是两个BFS,可是我觉得对于火的BFS可以转换成判断,我的做法是将火的位置全部记录下来,然后判断某个位置距离每个火的步数是否小于当前步数,可是错了,还不清楚 ...

  6. 2152 Balloons(两遍bfs求图的连通块)

    2152 Balloons(两遍bfs求图的连通块) Problem Description Both Saya and Kudo like balloons. One day, they heard ...

  7. csu1726 你经历过绝望吗?两次!

    4月16日,日本熊本地区强震后,受灾严重的阿苏市一养猪场倒塌,幸运的是,猪圈里很多头猪依然坚强存活.当地15名消防员耗时一天解救围困的"猪坚强".不过与在废墟中靠吃木炭饮雨水存活3 ...

  8. 你经历过绝望吗?两次!

    2个注意, 一个是优先级重写.利用,里面没有引用,然后是左大于右就排在后面. bool operator<(mynode ne1, mynode ne2) { return ne1.cost & ...

  9. 编译Spring5.0.x源码之一路坎坷,你经历过绝望吗?

    本文来说说在编译spring-springframework-5.0.x的路上,小编我到底经历了什么? 如果正在看文章你,恰好也想要研究spring源码,那么请先做好准备再动手,不然迎来的问题如滔滔江 ...

最新文章

  1. kafka高可用(集群)
  2. 计算机怎么模拟人,计算机能不能模拟人的思维?
  3. javascript一句话技巧
  4. 学习这么美丽的事,你要不要和我一起?
  5. 暑假集训做题,比赛的网站
  6. 阿里6年,我的技术蜕变之路!
  7. 練習重繪TreeView控件
  8. AMD第七代桌面APU揭秘:主流首次上DDR4
  9. 字符串参数传递与返回值(转)
  10. 拖拽 开发 easyui php,Easyui-Builder
  11. 记录:添加trace_event埋点并调用
  12. kotlin基本语法--kotlin官网文档学习
  13. 下载编译LineageOS代码
  14. 传谷歌金山秘密合作研发Office软件
  15. linux操作TF卡的命令
  16. 外国内乱时,撤侨不一定是最佳策略
  17. mysql数据库字符集实践详解_mysql数据库 详解 之 自学成才1
  18. 认知篇---嵌入式工程师的未来发展前景怎么样
  19. Android_GitHub_xUtils之DbUtils、ViewUtils、HttpUtils、BitmapUtils
  20. Spring - 解决 SpringUtil getBean NPE 问题

热门文章

  1. 硬仗酒全线升级,新概念新玩法新风尚
  2. kaldi特征和模型空间转换
  3. 智能家居之温湿度传感器
  4. IntelliJ IDEA剪切复制快捷键 失效解决方案
  5. idea java项目乱码问题处理
  6. 高权重外链发布秘密技巧(虚拟外链转物理外链工具)
  7. Docker 无法启动 Failed to start LSB: Create lightweight, portable, self-sufficient containers.
  8. 2022-07-31:给出一个有n个点,m条有向边的图, 你可以施展魔法,把有向边,变成无向边, 比如A到B的有向边,权重为7。施展魔法之后,A和B通过该边到达彼此的代价都是7。 求,允许施展一次魔法
  9. 解决wifi连接错误:无法连接到这个网络
  10. SUST OJ 1675: Fehead的项目(单调栈)