大胖子走迷宫【第十届】【决赛】【研究生组】

2024-02-24 18:20

本文主要是介绍大胖子走迷宫【第十届】【决赛】【研究生组】,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

问题描述

小明是个大胖子,或者说是个大大胖子,如果说正常人占用 1 × 1 1 × 1 1×1 的面积,小明要占用 5 × 5 5 × 5 5×5 的面积。

由于小明太胖了,所以他行动起来很不方便。

当玩一些游戏时,小明相比小伙伴就吃亏很多。

小明的朋友们制定了一个计划,帮助小明减肥。

计划的主要内容是带小明玩一些游戏,让小明在游戏中运动消耗脂肪。

走迷宫是计划中的重要环节。

朋友们设计了一个迷宫,迷宫可以看成是一个由 n × n n × n n×n 个方阵组成的方阵,正常人每次占用方阵中 1 × 1 1 × 1 1×1 的区域,而小明要占用 5 × 5 5 × 5 5×5 的区域。

小明的位置定义为小明最正中的一个方格。

迷宫四周都有障碍物。

为了方便小明,朋友们把迷宫的起点设置在了第 3 3 3 行第 3 3 3 列,终点设置在了第 n − 2 n − 2 n2 行第 n − 2 n − 2 n2 列。

小明在时刻 0 0 0 出发,每单位时间可以向当前位置的上、下、左、右移动单位 1 1 1 的距离,也可以停留在原地不动。

小明走迷宫走得很辛苦,如果他在迷宫里面待的时间很长,则由于消耗了很多脂肪,他会在时刻 k k k 变成一个胖子,只占用 3 × 3 3 × 3 3×3 的区域。

如果待的时间更长,他会在时刻 2 k 2k 2k 变成一个正常人,只占用 1 × 1 1 × 1 1×1 的区域。

注意,当小明变瘦时迷宫的起点和终点不变。

请问,小明最少多长时间能走到迷宫的终点。

注意,小明走到终点时可能变瘦了也可能没有变瘦。

输入格式

输入的第一行包含两个整数 n , k n, k n,k

接下来 n n n 行,每行一个由 n n n 个字符组成的字符串,字符为 + 表示为空地,字符为 * 表示为阻碍物。

输出格式

输出一个整数,表示答案。

数据范围

1 ≤ n ≤ 300 1 \ \le n \ \le 300 1 n 300,
1 ≤ k ≤ 1000 1 \ \le k \ \le 1000 1 k 1000

输入样例:
9 5
+++++++++
+++++++++
+++++++++
+++++++++
+++++++++
***+*****
+++++++++
+++++++++
+++++++++ 
输出样例:
16 

思路

简单的 B F S BFS BFS 求最短路即可,但是需要注意的是,不同时刻占据的格子数目会变化,所以可能遇到像给出的案例这种,需要先在上面走一走,让自己影响的格子数目变成一个之后才能往下走,所以我们可以做一个优化,再每一次走到一个格子时,向队列添加一个在这个格子这里等待一步的对象,如果已经达到了 2 k 2k 2k 那就不需要添加,就当正常的 B F S BFS BFS 求最短路即可。

代码

#include <iostream>
#include <cstring>
#include <algorithm>
#include <queue>#define x first
#define y secondusing namespace std;typedef pair<pair<int, int>, int> PIII;const int N = 410;int n, k;
char g[N][N];
queue<PIII> q;
bool st[N][N];
int dx[4] = {-1, 0, 1, 0}, dy[4] = {0, 1, 0, -1};bool check(int tx, int ty, int sk)
{sk = 2 - sk / k >= 0 ? 2 - sk / k : 0;for ( int i = tx - sk; i <= tx + sk; i ++ )for ( int j = ty - sk; j <= ty + sk; j ++ ){if ( i < 1 || i > n || j < 1 || j > n ) return false;if ( g[i][j] == '*' ) return false;}return true;
}int bfs(int sx, int sy)
{q.push({{sx, sy}, 0});st[sx][sy] = true;while ( q.size() ){PIII t = q.front();q.pop();if ( t.x.x == n - 2 && t.x.y == n - 2 ) return t.y;if ( t.y < 2 * k ) q.push({t.x, t.y + 1});st[t.x.x][t.x.y] = true;for ( int i = 0; i < 4; i ++ ){int a = t.x.x + dx[i], b = t.x.y + dy[i];if ( a < 1 && a > n || b < 1 || b > n ) continue;if ( st[a][b] ) continue;if ( !check(a, b, t.y) ) continue;q.push({{a, b}, t.y + 1});st[a][b] = true;}}return -1;
}int main()
{cin >> n >> k;for ( int i = 1; i <= n; i ++ ) cin >> g[i] + 1;cout << bfs(3, 3) << endl;return 0;
}

这篇关于大胖子走迷宫【第十届】【决赛】【研究生组】的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/742956

相关文章

研究生生涯中一些比较重要的网址

Mali GPU相关: 1.http://malideveloper.arm.com/resources/sdks/opengl-es-sdk-for-linux/ 2.http://malideveloper.arm.com/resources/tools/arm-development-studio-5/ 3.https://www.khronos.org/opengles/sdk/do

【超级干货】2天速成PyTorch深度学习入门教程,缓解研究生焦虑

3、cnn基础 卷积神经网络 输入层 —输入图片矩阵 输入层一般是 RGB 图像或单通道的灰度图像,图片像素值在[0,255],可以用矩阵表示图片 卷积层 —特征提取 人通过特征进行图像识别,根据左图直的笔画判断X,右图曲的笔画判断圆 卷积操作 激活层 —加强特征 池化层 —压缩数据 全连接层 —进行分类 输出层 —输出分类概率 4、基于LeNet

nyoj306(走迷宫)

走迷宫 时间限制: 1000 ms  |  内存限制: 65535 KB 难度:5 描述 Dr.Kong设计的机器人卡多非常爱玩,它常常偷偷跑出实验室,在某个游乐场玩之不疲。这天卡多又跑出来了,在SJTL游乐场玩个不停,坐完碰碰车,又玩滑滑梯,这时卡多又走入一个迷宫。整个迷宫是用一个N * N的方阵给出,方阵中单元格中填充了一个整数,表示走到这个位置的难度。 这个迷宫可以向上走,向

《GOF设计模式》—抽象工厂(Abstract Factory)—Delphi源码示例:基于抽象工厂的迷宫

 示例:基于抽象工厂的迷宫   实现:     如果TMaze.Create是传递一个对象当作参数来建立rooms、walls及doors;如此你可以以不同的参数来改变rooms、walls及doors的类。  请注意MazeFactory也就是工厂方法(Factory Method)的一个集合;这是最通常实现抽象工厂模式的方式。同时请注意MazeFactory不是一个抽象类

走迷宫变体【拼多多1面0905】

题目大致描述: 有一个N*M的迷宫,主角被放在随机的位置上,给你一个函数,控制主角逃离迷宫。 可以使用的函数:int move(String direction) (//direction代表上下左右四个方向,分别是“U"、“D"、“L"、“R"//返回值有3种,包括-1、0、1;-1表示前面是陷阱或墙,主角不能往前走,会留在原地;0表示迷宫出口,恭喜成功逃离;1表示前面可以走,主角前进一格)

研究生必读→如何获得全文文献

如何获取文献 〖说明〗 搞研究的人离不开文献,可是很多院校未能购卖国内外商业数据库,如PUBMED、ElseVier等,因而检索国外全文文献很复杂。就是一些中文的要是没有给银子,也会难得到原文,方便的得到全文往往成为少数学校的专利。从网络上积累了一些资料,跟据自己平时的积累进行了一些修改,写了这个文章,结果发表在南大BBS上很是得到欢迎,所以决心写的好一些,就进行了几次修改,

P7492 [传智杯 #3 决赛] 序列

*原题链接* 一道类似势能线段树的题,区间按位或上k,不满足区间可合并的性质,只能暴力的单点修改。 但是考虑按位或的性质,一个数或上另一个数,只会变大或不变,如果我们能找到一个方法,能够判定区间里的数,或上k后是否有改变,就可以避免的暴力了。我一开始想的是线段树里维护一个的数组,表示区间内所有数的二进制表示下某一位是否为1,但这太难写,最后无奈去看官方题解,发现只要维护区间所有数的按位与和An

2024年第十届数维杯国际大学生数学建模挑战赛

竞赛介绍 为了培养学生的创新意识及运用数学方法和计算机技术解决实际问题的能力,内蒙古创新教育学会、内蒙古基础教育研究院决定主办2024年第十届数维杯国际大学生数学建模挑战赛(国际赛)。 数维杯大学生数学建模挑战赛每年分为两场,每年上半年为数维杯国赛(5月,俗称小国赛),下半年为数维杯国际赛(11月),2023年数维杯国际大学生数学建模挑战赛共有近1.5万名学生参赛,参赛队伍来自国内外1177所

FZU1205/SDUT1157_小鼠迷宫问题(DFS+BFS)

解题报告 http://blog.csdn.net/juncoder/article/details/38146041 题目传送门 题意 求最短路和最短路的路数。 思路: BFS+DFS,先求出最短路。在DFS搜等于最短路的条数。 不加优化SDUTOJ过了,数据就是水。 确定了最短路的长度,加上奇偶剪枝FOJ也过了。 #include <queue>#include <c

A*算法解决迷宫寻路问题

A*算法解决迷宫寻路问题 问题描述 下图是一个迷宫,试为机器人找一条从Start到End的最短路径设计一搜索算法 设计思路 a)状态空间的表示 首先将迷宫图转换为列表形式呈现,每个格子用 (横坐标,纵坐标,上通路状态,下通路状态,左通路状态,右通路状态)来表示,通路状态用1或0表示,可通过为1,不可通过为0。比如起点(1,1),假定不能从起点出去,所以(1,1)可以走下或走右,所以第一格