这周做了一部分搜索的题后,我发现这种题看似好像题目都差不多,但是其实写起来有可能有部分不同甚至是大相径庭。所以这周我想通过一道改了两天的题来总结一下。
回家
小 H 在一个划分成了 n \times mn×m 个方格的长方形封锁线上。 每次他能向上下左右四个方向移动一格(当然小 H 不可以静止不动), 但不能离开封锁线,否则就被打死了。 刚开始时他有满血 66 点,每移动一格他要消耗 11 点血量。一旦小 H 的血量降到 00, 他将死去。 他可以沿路通过拾取鼠标(什么鬼。。。)来补满血量。只要他走到有鼠标的格子,他不需要任何时间即可拾取。格子上的鼠标可以瞬间补满,所以每次经过这个格子都有鼠标。就算到了某个有鼠标的格子才死去, 他也不能通过拾取鼠标补满 HP。 即使在家门口死去, 他也不能算完成任务回到家中。
地图上有五种格子:
0:障碍物。
1:空地, 小 H 可以自由行走。
2:小 H 出发点, 也是一片空地。
3:小 H 的家。
4:有鼠标在上面的空地。
小 H 能否安全回家?如果能, 最短需要多长时间呢?
输入格式
第一行两个整数 n,mn,m, 表示地图的大小为 n \times mn×m。
下面 nn 行, 每行 mm 个数字来描述地图。
输出格式
一行, 若小 H 不能回家, 输出 -1,否则输出他回家所需最短时间。
第一遍核心搜索代码:
void run(int a, int b,int timee,int xie)
{
if (timee >= n * m)return;
if (xie == 0 || timee > minn)return;
if (a<1 || a>n || b<1 || b>m)
{
return;
}
if (point[a][b] == 3)
{
if (timee < minn) minn = timee;
}
if (point[a][b] == 0)return;
if (point[a][b] == 4)run(a, b, timee+1, 6);
for (int i = 0; i < 4; i++)
{
int ax = a + x[i];
int by = b + y[i];
if (xie - 1 == 0)retu
搜索专题总结
最新推荐文章于 2024-10-19 10:53:04 发布