博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
怪兽迷宫
阅读量:5202 次
发布时间:2019-06-13

本文共 1760 字,大约阅读时间需要 5 分钟。

源代码:#include
#include
int m,n,Num(0),X[1000001],Y[1000001],i[1001][1001];bool f[1001][1001],Vis[1001][1001];int x[4]={
0,0,1,-1};int y[4]={
1,-1,0,0};bool Check(int Limit){ memset(X,0,sizeof(X)); memset(Y,0,sizeof(Y)); memset(Vis,0,sizeof(Vis)); //预处理。 int Head=0,Tail=1; X[1]=1; Y[1]=1; Vis[1][1]=true; while (Head
=1&&T1<=n&&T2>=1&&T2<=m&&!Vis[T1][T2]&&!f[T1][T2]&&i[T1][T2]>=Limit) { Tail++; X[Tail]=T1; Y[Tail]=T2; Vis[T1][T2]=true; if (T1==n&&T2==m) return true; } } } return false;}void BFS() //BFS处理每个点到最近怪兽的距离,搜索蒟蒻的我T_T。{ int Head=0,Tail=Num; while (Head
=1&&T1<=n&&T2>=1&&T2<=m&&!i[T1][T2]&&!f[T1][T2]) { //BFS是按队列顺序的,所以先找到肯定更优。 i[T1][T2]=i[t1][t2]+1; Tail++; X[Tail]=T1; Y[Tail]=T2; } } }}int main(){ scanf("%d%d",&n,&m); for (int a=1;a<=n;a++) for (int b=1;b<=m;b++) { scanf("%d",&f[a][b]); if (f[a][b]) { X[++Num]=a; //记录怪兽节点。 Y[Num]=b; } } if (f[1][1]||f[n][m]) //特判。 { printf("0"); return 0; } BFS(); int Left=0,Right=m+n,Ans=0; while (Left<=Right) //二分答案。 { int Mid=(Left+Right)>>1; if (Check(Mid)) { Ans=Mid; Left=Mid+1; } else Right=Mid-1; } printf("%d",Ans); return 0;}/* 二分答案+BFS。 先预处理出所有节点与怪兽的最短距离,然后BFS,看看能不能走到终点。 遇到想不出来的题,想想二分有没有用武之地。 搜索真是个很玄学的东西,做题还是少。*/

转载于:https://www.cnblogs.com/Ackermann/p/6041371.html

你可能感兴趣的文章
Poj 1094 拓扑排序 水题
查看>>
Oracle SQL查询,日期过滤条件要注意的一点
查看>>
链表快排
查看>>
链表操作合集
查看>>
C# 编写通用的JSON数据进行序列化和反序列化
查看>>
windows对象
查看>>
leetcode852 C++ 20ms 找最高峰 序列先增后减
查看>>
JavaScript深入系列(一)--原型和原型链详解
查看>>
一点感想
查看>>
产生随机数
查看>>
vm center(VC)5.1登陆密码忘记了怎么办?
查看>>
TFS 2015 敏捷开发实践 – 看板的使用
查看>>
UINavigationController的简单使用
查看>>
Python命名规范
查看>>
50款漂亮的国外婚礼邀请函设计(上篇)
查看>>
MD5加密简单算法
查看>>
安装Qcreator2.5 + Qt4.8.2 + MinGW_gcc_4.4 (win7环境)
查看>>
代码检查
查看>>
滚动条
查看>>
程序员的自我修养九Windows下的动态链接
查看>>