青铜莲花池题解

关于#282青铜莲花池的一些见解

#282. 青铜莲花池

题目描述

Farmer John为了满足贝茜对美的享受而安装了人工湖。矩形的人工湖分成M行N列(1 <= M <= 30; 1 <= N <= 30)的方形小格子。有些格子有美丽的荷叶,有些有岩石,剩下的格子有的只是美丽的蓝色湖水。

贝茜通过从一片荷叶跳到另一片荷叶上来练习芭蕾。它现在正站在一片荷叶上(看输入数据了解具体位置)。它希望通过在荷叶上跳跃来到达另一片荷叶。它既不能跳到水里也不能跳到岩石上。

 只有新手才会感到吃惊:奶牛们的跳跃有点类似国际象棋中马那样的移动,在一个方向上(如水平方向)移动M1(1 <= M1 <= 30)“格”,然后再在另一个方向上(如竖直方向)移动M2 (1 <= M2 <= 30; M1 != M2)格,所以贝茜有时可能有多达8中的跳跃选择。
         给出池塘的构造以及贝茜跳跃的形式,找出贝茜从一个位置移动到另一个位置所需的最小的跳跃次数。这个跳跃对于所给的测试数据总是可能的。

输入格式

第 1 行: 四个空格分开的整数: M, N, M1, 和 M2

第 2 至 M+1行: 第i+1行用N个空格分开的整数描述池塘第i行,0表示水,1表示荷叶,2表示岩石,3表示贝茜现在站的那块荷叶,4表示跳跃的终点。

输出格式

一个整数,是贝茜从一块荷叶跳到另一块荷叶所需的最小的跳跃数。

样例数据

input

4 5 1 2
1 0 1 0 1
3 0 2 0 4
0 1 2 0 0
0 0 0 1 0

输入说明:

贝茜在第二行的左边开始;她的目的地在第二行的右边。池塘中有几块荷叶和岩石。

output

2

输出说明:

贝茜跳到了(1,3)的荷叶上,再跳到目的地。

数据规模与约定

保证1M301N301≤M≤30,1≤N≤30

时间限制:1s1s

空间限制:256MB


---------------------------------------------------------------------------------------------------------------------------------

(以上为题目描述)

<前言>

第一次在发单题题解,有不详细之处请见谅; 因为ckn找我看#282(即青铜莲花池)无果之后,我决定让这世界上所有像他那样不标准、别扭不堪的青铜莲花池消失,我决定写题解了。

更详细的见课件“bfs”;

我讲的只是个人建议(虽然步骤精确),并不是题解;大佬看到只哂笑即可;


未订修版;;


<正文>

1.变量与初始化:一些坐标个人认为简单一点的方法是直接定义结构体,队列可以直接用STL库(好像还不太好来着);开两个数组(vis[](判断是否走过)、a[](存储读入数据))与方向数组(dx[](横坐标),dy[](纵坐标));

方向数组:ckn这厮偏偏倔的不用方向数组读入之后存数据,害的我啥错误都看不出来(一大堆乱七八糟的);请大家直接用八个赋值语句与负号赋值;

方向数组如下:

    dx[0]=-m1;dy[0]=m2; dx[1]=-m1;dy[1]=-m2;  
    dx[2]=-m2;dy[2]=-m1;dx[3]=-m2;dy[3]=m1;  
    dx[4]=m1;dy[4]=m2;  dx[5]=m1;dy[5]=-m2;  
    dx[6]=m2;dy[6]=m1;  dx[7]=m2;dy[7]=-m1;  //方向数组赋值

2.读入:这个应该不用多说吧,就是判断一下是否是:水或岩石(赋值为1)、莲花(0)、起点终点(可用结构体定义st、en);

3.bfs的准备:队列也为结构体的类型,先将起点入队;将起点的vis[]赋值为1(表示已走过);

4.开始bfs,具体可以自己写,方向数组别忘了:

献上一段用STL库队列的代码(我比较懒,不喜欢手打队列)

   while(!q.empty())  //如果队不为空 
    {  
        temp=q.front();  //队首出队 
        q.pop();  
        for(int i=0;i<8;i++)  //八个方向逐个寻找 
        {  
            tmp=temp;  
            tmp.step++;tmp.x+=dx[i];tmp.y+=dy[i];  
            if(tmp.x==end.x && tmp.y==end.y)   //如果到终点 
                return tmp.step;  
            if((tmp.x<1)||(tmp.y<1)||(tmp.x>n)||(tmp.y>m)||(ma[tmp.x][tmp.y]==1)||(vis[tmp.x][tmp.y]==1))   
               continue;   
            else {  
              vis[tmp.x][tmp.y]=1;q.push(tmp);  //标记,入队 
            }  
        }  
    }

以上基本就是核心代码了;

别告诉我你bfs不会,那么请点击右上角的叉叉(还看什么辣鸡博客);

5.输出请自行,懒得说了(我是一只很懒的蒟蒻);

详细代码见:http://10.10.21.57/submission/14918(你们很可能进不去)

请自便。。。。。。。。。。。。。。。。。。。。。。。。


<后记>

其实写这篇博客不止给ckn看,也可以自己复习一下bfs;

baibai~~


猜你喜欢

转载自blog.csdn.net/qq_40900472/article/details/80990544