2019第十届蓝桥杯——I.胖子迷宫
题目意思:给你一个n*m的迷宫,+能走,*障碍物,一个胖子一开始在3,3,体积为5*5
不过胖子走迷宫的目的是为了减肥,给你一个时间k,当到达时间k时,胖子饿瘦了变成3*3,当到达时间2*k时,更瘦了变成1*1
题目要求到达(n-2,m-2)这个点所需的最短时间。
n,m<=300,
解决思路,参考hdu1026,bfs+优先队列(这里如果 不直接原地跳跃到k时刻,而是选择time+1呆在原地,那么不用优先队列也可以,优先队列的作用是,每一层扩展开来的结点是会改变时刻的,比如说hdu1026是要在一个节点打怪打几个小时,而普通的队列bfs,以其扩展顺序为时刻,所以按顺序搜索就行了)
注意几点:
1.四个方向的写法:int foot[4][2]={-1,0,1,0,0,-1,0,1};
2.根据当前时间判断胖子大小,然后决定胖子在原地待多少时间(k或者2k)
3.学会了freopen重定向的写法
4.迷宫问题还是在周围附一圈边界写起来方便
5.pre数组主要是为了记录路径方便查看(来自hdu1026),print1函数也是为了打印路径,可忽略。
6.可以尝试que.push({ nex.ti,nex.x,nex.y,nex.da});(与定义int ti,x,y,da;顺序相对应) 的写法
#include<cstdlib>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<iostream>
#include<string>
#include<vector>
#include<stack>
#include<bitset>
#include<cmath>
#include<set>
#include<list>
#include<deque>
#include<map>
#include<queue>using namespace std;char a[310][310];
bool p[310][310];
int n,m,k,dada,num;
int foot[4][2]={-1,0,1,0,0,-1,0,1};struct node
{int ti,x,y,da;friend bool operator < (node a,node b){return (a.ti>b.ti) || ((a.ti==b.ti)&&(a.da>b.da));}
};
priority_queue<node>q;
struct route
{int x,y,da,ti;
}pre[310][310][6];bool pan(int x,int y,int da)
{for (int i=x-da;i<=x+da;i++)for (int j=y-da;j<=y+da;j++)if (a[i][j]=='*') return false;return true;
}int bfs()
{node w;w.x=3;w.y=3;w.ti=0;w.da=5;q.push(w);w.x=3;w.y=3;w.ti=k;w.da=3;q.push(w);w.x=3;w.y=3;w.ti=2*k;w.da=1;q.push(w);pre[3][3][5].x=-1;pre[3][3][5].y=-1;pre[3][3][3].x=-1;pre[3][3][3].y=-1;pre[3][3][1].x=-1;pre[3][3][1].y=-1;p[3][3]=1;w=q.top();while (w.x!=n-2 || w.y!=m-2){node nex,tem;for (int i=0;i<4;i++){int x=w.x+foot[i][0],y=w.y+foot[i][1];if (pan(x,y,w.da/2) && p[x][y]==0){p[x][y]=1;nex.x=x;nex.y=y;nex.ti=w.ti+1;if (nex.ti>=2*k) nex.da=1;else if (nex.ti>=k){nex.da=3;tem.x=x;tem.y=y;tem.ti=2*k;tem.da=1;q.push(tem);pre[tem.x][tem.y][tem.da].x=nex.x;pre[tem.x][tem.y][tem.da].y=nex.y;pre[tem.x][tem.y][tem.da].da=nex.da;pre[tem.x][tem.y][tem.da].ti=nex.ti;}else{nex.da=5;tem.x=x;tem.y=y;tem.ti=2*k;tem.da=1;pre[tem.x][tem.y][tem.da].x=nex.x;pre[tem.x][tem.y][tem.da].y=nex.y;pre[tem.x][tem.y][tem.da].da=nex.da;pre[tem.x][tem.y][tem.da].ti=nex.ti;q.push(tem);tem.x=x;tem.y=y;tem.ti=k;tem.da=3;pre[tem.x][tem.y][tem.da].x=nex.x;pre[tem.x][tem.y][tem.da].y=nex.y;pre[tem.x][tem.y][tem.da].da=nex.da;pre[tem.x][tem.y][tem.da].ti=nex.ti;q.push(tem);}q.push(nex);pre[nex.x][nex.y][nex.da].x=w.x;pre[nex.x][nex.y][nex.da].y=w.y;pre[nex.x][nex.y][nex.da].da=w.da;pre[nex.x][nex.y][nex.da].ti=w.ti;}}q.pop();if (q.empty()) break;w=q.top();}dada=w.da;if (!q.empty()) return w.ti;else return 0;
}void print1(int n,int m,int dad,int tt)
{int x=pre[n][m][dad].x,y=pre[n][m][dad].y,da=pre[n][m][dad].da,ti=pre[n][m][dad].ti;if (x<0) return;print1(x,y,da,ti);num++;printf("%ds:(%d,%d)->(%d,%d),da=%d\n",tt,x,y,n,m,dad);/*int z=0;if (a[n][m]!='.') z=a[n][m]-'0';for (int i=1;i<=z;i++){num++;printf("%ds:FIGHT AT (%d,%d)\n",num,n-1,m-1);}*/
}int main()
{freopen("f1_input.txt","r",stdin); //输入重定向,输入数据将从in.txt文件中读取freopen("f1_output.txt","w",stdout); //输出重定向,输出数据将保存在out.txt文件中scanf("%d%d%d",&n,&m,&k);getchar();for (int i=1;i<=n;i++){for (int j=1;j<=m;j++){a[i][j]=getchar();}getchar();}for (int i=0;i<4;i++){printf("%d %d\n",foot[i][0],foot[i][1]);}//return 0;printf("%d %d\n",n,m);for (int i=1;i<=n;i++){for (int j=1;j<=m;j++){printf("%c",a[i][j]);}printf("\n");}for (int i=1;i<=n;i++){a[i][0]='*';a[i][m+1]='*';}for (int j=1;j<=m;j++){a[0][j]='*';a[n+1][j]='*';}while (!q.empty()) q.pop();memset(p,0,sizeof(p));memset(pre,0,sizeof(pre));int ans=bfs();printf("%d\n",ans);num=0;/*for (int i=1;i<=n;i++){for (int j=1;j<=m;j++){for (int k=1;k<=5;k=k+2)printf("%d %d %d\n",pre[i][j][k].x,pre[i][j][k].y,pre[i][j][k].da);printf("j=%d\n",j);}printf("\n");}*/print1(n-2,m-2,dada,ans);fclose(stdin);//关闭文件fclose(stdout);//关闭文件return 0;
}
结果:
参考博客:
https://blog.csdn.net/akunda/article/details/90613048
https://blog.csdn.net/df_cjc/article/details/79110840
2019第十届蓝桥杯——I.胖子迷宫相关推荐
- java蓝桥杯省赛第十届_2019年第十届蓝桥杯省赛-迷宫(BFS/Excel大法)
这题用dfs搜不出来,需要使用bfs并记录路径,设置好方向顺序跑就ok 然而毕竟是暴力杯,我们的原则是代码能省就省(懒癌晚期 于是乎网上便出现了形形色色的题解,笔者综合了各路大神神乎其技的思想,总结出 ...
- 2019第十届蓝桥杯大赛软件类省赛C++ C组真题题解
============================== 2019-2021蓝桥杯C++ C组真题题解: 2019第十届蓝桥杯大赛软件类省赛C++ C组真题题解 2020第十一届蓝桥杯大赛软件类省 ...
- 2019第十届蓝桥杯大赛软件类省赛C++ B组真题题解
========================================== 2019-2021蓝桥杯C++ B组真题题解: 2019第十届蓝桥杯大赛软件类省赛C++ B组真题题解 2020第 ...
- 2019第十届蓝桥杯A组决赛(国赛)A题(三升序列)
2019第十届蓝桥杯A组决赛(国赛)A题(三升序列) 输入: VLPWJVVNNZSWFGHSFRBCOIJTPYNEURPIGKQGPSXUGNELGRVZAG SDLLOVGRTWEYZKKXNK ...
- 糖果(2019第十届蓝桥杯省赛C++A组I题) 解题报告(状压dp) Apare_xzc
糖果(2019第十届蓝桥杯省赛C++A组I题) 解题报告(状压dp) xzc 2019/4/5 试题 I: 糖果 时间限制: 1.0s 内存限制: 256.0MB 本题总分:25分 [问题描述] ...
- 2019第十届蓝桥杯JAVA G组题解
蓝桥杯历年真题及解析. 试题 A: 立方和 本题总分:5 分 [问题描述] 小明对数位中含有 2.0.1.9 的数字很感兴趣,在 1 到 40 中这样的数包 括 1.2.9.10 至 32.39 和 ...
- 2019第十届蓝桥杯省赛总结
第十届蓝桥杯是在郑州的河南农大龙子湖校区举办的,这是我第一次参加蓝桥杯比赛,前一天晚上在酒店住的,因为自己也不知道自己成绩能如何,所以也就一直睡不着:第二天早上九点开始比赛的,比赛时长为4个小时,下午 ...
- 2019 第十届蓝桥杯省赛C/C++大学B组 试题+题解
第十届蓝桥杯省赛C/C++大学B组 试题+题解 第十届蓝桥杯大赛软件类省赛 C/C++ 大学 B 组 考生须知 考试开始后,选手首先下载题目,并使用考场现场公布的解压密码解压试 题. 考试时间为 4 ...
- 2019第十届蓝桥杯C++B组题解(赛后重写的,不确保答案正确性,仅供参考)
先说一下这次的感受吧,我们考场比较乱,开始比赛了,还有的电脑有故障,(向这些人发出同情),第一次认真参加比赛,真正比赛的时候感觉没有那么正式,很乱,各种小问题,(例如博主就没找到题目在哪里,找到后又不 ...
最新文章
- Mybatis获取插入记录的自增长ID
- 初学java之JFrame窗口模式
- Failed to install DroidIPCam.apk on device 'emulator-5554': timeout
- Python dataframe修改列顺序(pandas学习)
- Squid 反向代理服务器配置
- 【资讯】人工智能专业职称来了,快来看看你够不够申请资格!
- canvas 文字颜色_Canvas基本功能Canvas标签
- Mac os x 系统的发展史
- 音频录制和Speech语音识别(ios10)
- Linux常用命令介绍(二)——压缩与解压缩命令
- java考试时间,Java认证考试知识点:Java时间类的函数
- 联想小新air13装双系统_联想小新 Air 13IBK Pro 安装黑苹果Windows双系统教程
- Hardware ---- 输出阻抗
- 完全理解android事件分发机制
- [NOI2008] 糖果雨
- Redis Eviction policies (驱逐策略)
- Deep Mutual Learning
- TVS 管 和TSS管
- 微服务-长轮询异常:SecurityManager accessible to the calling code
- 调幅波解调-二极管峰值包络检波器【Multisim】【高频电子线路】