题目意思:给你一个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.胖子迷宫相关推荐

  1. java蓝桥杯省赛第十届_2019年第十届蓝桥杯省赛-迷宫(BFS/Excel大法)

    这题用dfs搜不出来,需要使用bfs并记录路径,设置好方向顺序跑就ok 然而毕竟是暴力杯,我们的原则是代码能省就省(懒癌晚期 于是乎网上便出现了形形色色的题解,笔者综合了各路大神神乎其技的思想,总结出 ...

  2. 2019第十届蓝桥杯大赛软件类省赛C++ C组真题题解

    ============================== 2019-2021蓝桥杯C++ C组真题题解: 2019第十届蓝桥杯大赛软件类省赛C++ C组真题题解 2020第十一届蓝桥杯大赛软件类省 ...

  3. 2019第十届蓝桥杯大赛软件类省赛C++ B组真题题解

    ========================================== 2019-2021蓝桥杯C++ B组真题题解: 2019第十届蓝桥杯大赛软件类省赛C++ B组真题题解 2020第 ...

  4. 2019第十届蓝桥杯A组决赛(国赛)A题(三升序列)

    2019第十届蓝桥杯A组决赛(国赛)A题(三升序列) 输入: VLPWJVVNNZSWFGHSFRBCOIJTPYNEURPIGKQGPSXUGNELGRVZAG SDLLOVGRTWEYZKKXNK ...

  5. 糖果(2019第十届蓝桥杯省赛C++A组I题) 解题报告(状压dp) Apare_xzc

    糖果(2019第十届蓝桥杯省赛C++A组I题) 解题报告(状压dp) xzc 2019/4/5 试题 I: 糖果 时间限制: 1.0s 内存限制: 256.0MB 本题总分:25分 [问题描述]    ...

  6. 2019第十届蓝桥杯JAVA G组题解

    蓝桥杯历年真题及解析. 试题 A: 立方和 本题总分:5 分 [问题描述] 小明对数位中含有 2.0.1.9 的数字很感兴趣,在 1 到 40 中这样的数包 括 1.2.9.10 至 32.39 和 ...

  7. 2019第十届蓝桥杯省赛总结

    第十届蓝桥杯是在郑州的河南农大龙子湖校区举办的,这是我第一次参加蓝桥杯比赛,前一天晚上在酒店住的,因为自己也不知道自己成绩能如何,所以也就一直睡不着:第二天早上九点开始比赛的,比赛时长为4个小时,下午 ...

  8. 2019 第十届蓝桥杯省赛C/C++大学B组 试题+题解

    第十届蓝桥杯省赛C/C++大学B组 试题+题解 第十届蓝桥杯大赛软件类省赛 C/C++ 大学 B 组 考生须知 考试开始后,选手首先下载题目,并使用考场现场公布的解压密码解压试 题. 考试时间为 4 ...

  9. 2019第十届蓝桥杯C++B组题解(赛后重写的,不确保答案正确性,仅供参考)

    先说一下这次的感受吧,我们考场比较乱,开始比赛了,还有的电脑有故障,(向这些人发出同情),第一次认真参加比赛,真正比赛的时候感觉没有那么正式,很乱,各种小问题,(例如博主就没找到题目在哪里,找到后又不 ...

最新文章

  1. Mybatis获取插入记录的自增长ID
  2. 初学java之JFrame窗口模式
  3. Failed to install DroidIPCam.apk on device 'emulator-5554': timeout
  4. Python dataframe修改列顺序(pandas学习)
  5. Squid 反向代理服务器配置
  6. 【资讯】人工智能专业职称来了,快来看看你够不够申请资格!
  7. canvas 文字颜色_Canvas基本功能Canvas标签
  8. Mac os x 系统的发展史
  9. 音频录制和Speech语音识别(ios10)
  10. Linux常用命令介绍(二)——压缩与解压缩命令
  11. java考试时间,Java认证考试知识点:Java时间类的函数
  12. 联想小新air13装双系统_联想小新 Air 13IBK Pro 安装黑苹果Windows双系统教程
  13. Hardware ---- 输出阻抗
  14. 完全理解android事件分发机制
  15. [NOI2008] 糖果雨
  16. Redis Eviction policies (驱逐策略)
  17. Deep Mutual Learning
  18. TVS 管 和TSS管
  19. 微服务-长轮询异常:SecurityManager accessible to the calling code
  20. 调幅波解调-二极管峰值包络检波器【Multisim】【高频电子线路】

热门文章

  1. 程序员如何赚「睡后」收入?
  2. C语言基础题集(课前:一维数组,二维数组)
  3. cmake和make的简单理解
  4. 数据众包平台Premise持续向美军提供情报数据
  5. 计世资讯:用户对大数据安全分析需求逐渐迫切
  6. 小米公司开源 MIUI 6 第三方适配工具 『Patchrom』
  7. pgsql 后台回复数据
  8. 苹果电脑合并pdf文件最简单的方法?苹果电脑怎么把多个pdf文件合并成一个?
  9. 三角形,斜线,表头css实现方法
  10. Altium Designer PCB板框扩大