【bfs】【中等难度】wikioi3055 青铜莲花池

3055 青铜莲花池

题目描述 Description

为了让奶牛们娱乐和锻炼,农夫约翰建造了一个美丽的池塘。这个长方形的池子被分成了M 行N 列个方格(1 ≤ M, N ≤ 30)。一些格子是坚固得令人惊讶的莲花,还有一些格子是岩石,其余的只是美丽、纯净、湛蓝的水。贝西正在练习芭蕾舞,她站在一朵莲花上,想跳到另一朵莲 花上去,她只能从一朵莲花跳到另一朵莲花上,既不能跳到水里,也不能跳到岩石上。
     
贝西的舞步很像象棋中的马步:每次总是先横向移动M1 (1 ≤ M1 ≤ 30)格,再纵向移动M2 (1 ≤ M2 ≤ 30,
M1≠M2)格,或先纵向移动M1 格,再横向移动M2
格。最多时,贝西会有八个移动方向可供选择。给定池塘的布局和贝西的跳跃长度,请计算贝西从起点出发,到达目的地的最小步数,我们保证输入数据中的目的地
一定是可达的。

输入描述
Input Description

第一行:四个用空格分开的整数:M,N,M1 和M2
第二行到M + 1 行:第i + 1 行有N 个用空格分开的整数,描述了池塘第i 行的状态:0 为水,1 为莲花,2 为岩石,3 为贝西所在的起点,4 为贝西想去的终点。

输出描述
Output Description

第一行:从起点到终点的最少步数。

样例输入
Sample 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

样例输出
Sample Output

2

数据范围及提示 Data Size & Hint

【样例说明】
贝西从第二行的最左边出发,目标是第二行的最右边。
贝西先跳到第一行第三列的莲花上,再跳到终点,需要两步。

之所以叫青铜莲花池,是因为这是青铜组的,而我们还有白银组、黄金组!

思路Thinkings

这道题就是最基本的bfs啦。STL的队列我似乎不会用,不过手写一个应该不是太难的问题吧。。

卡了那么久。。还是上次那个原因:

cin>>M>>N;

判断边界是否溢出的条件是:if ( (x>0) && (x<=M) && (y>0) && (y<=N) && (没有走过) &&(路通) )
                               {
                                         ……
                               }
具体……的内容等会儿弄个框架。。。

p.s.:你不是说有黄金组的吗,白银组的吗?在哪儿在哪儿?

代码code

 1 #include<iostream>
 2 #include<cstdlib>
 3 #include<cstdio>
 4 using namespace std;
 5 struct note
 6 {
 7        int x,y,step;
 8 };
 9 int N,M,M1,M2;
10 int xx[10];
11 int yy[10];
12 int board[50][50];
13 int gone[50][50]={0};
14 note queue[10005];
15 int startx,starty,ansx,ansy,qh,qt;
16 note now,next;
17 void readin()
18 {
19      cin>>M>>N>>M1>>M2;
20      for (int i=1;i<=M;i++)
21      {
22        for (int j=1;j<=N;j++)
23       {
24         cin>>board[i][j];
25         gone[i][j]=0;
26         if (board[i][j]==3) {startx=i;starty=j;board[i][j]=1;gone[i][j]=1;}
27         if (board[i][j]==4) {ansx=i;ansy=j;board[i][j]=1;gone[i][j]=0;}
28       }
29      }
30      xx[1]=M1; xx[2]=M2; xx[3]=M2; xx[4]=M1; xx[5]=-M1; xx[6]=-M2; xx[7]=-M2; xx[8]=-M1;
31      yy[1]=M2; yy[2]=M1; yy[3]=-M1; yy[4]=-M2; yy[5]=-M2; yy[6]=-M1; yy[7]=M1; yy[8]=M2;
32     now.x=startx;now.y=starty; now.step=0;
33     queue[1]=now;
34     qh=1;qt=1;;
35 }
36
37 int main()
38 {
39     readin();
40     while ( qh<=qt )
41     {
42         now=queue[qh];
43         qh++;
44         if ( (now.x==ansx) && (now.y==ansy) )  { cout<<now.step<<endl; return 0; }
45         next.step=now.step+1;
46         for (int i=1;i<=8;i++)
47         {
48             next.x=now.x+xx[i];
49             next.y=now.y+yy[i];
50             if ( (next.x==ansx) && (next.y==ansy) )  { cout<<next.step<<endl; return 0; }
51             if ( (next.x>0) && (next.x<=M) && (next.y>0) && (next.y<=N) && (board[next.x][next.y]==1) && (gone[next.x][next.y]==0))
52             {
53                    gone[next.x][next.y]=1;
54                    qt++;
55                    queue[qt]=next;
56             }
57         }
58     }
59
60     return 0;
61 }

青铜莲花池AC代码

结果

p.s.:哎,还是有耗时,毕竟我很笨……

框架

恩,给自己弄个框架吧。。毕竟搜索是世界上最难的算法——暴力的一种嘛

struct note
{
      int x,y,step;
};
note queue[];

int main()
{
    cin>>M>>N;
    各种读入;
    queue[1].x=startx;queue[1].y=starty;queue[1].step=0;
    head=1;tail=1;
    while (head<=tail)
    {
            if (符合答案) {cout<<queue[head].step;return 0;}
            for (i=1;i<=情况数;i++)
            {
                    x=queue[head].x+movex[i];
                    y=queue[head].x+movey[i];
                    if ( (x>0) && (x<=M) && (y>0) && (y<=N) && (没有走过) &&(路通) )
                               {
                                        tail+=1;
                                        queue[tail].x=x;queue[tail].y=y;queue[tail].step=queue[head].step+1;
                               }
            }
            head+=1;
    }
    

【bfs】【中等难度】wikioi3055 青铜莲花池

时间: 2024-08-07 16:50:29

【bfs】【中等难度】wikioi3055 青铜莲花池的相关文章

青铜莲花池(Bronze Lilypad Pond, USACO 2007 Feb)

题目描述 为了让奶牛们娱乐和锻炼,农夫约翰建造了一个美丽的池塘.这个长方形的池子被分成了 M 行 N 列个方格(1 ≤ M, N ≤ 30) .一些格子是坚固得令人惊讶的莲花,还有一些格子是岩石,其余的只是美丽.纯净.湛蓝的水. 贝西正在练习芭蕾舞,她站在一朵莲花上,想跳到另一朵莲花上去,她只能从一朵莲花跳到另一朵莲花上,既不能跳到水里,也不能跳到岩石上. 贝西的舞步很像象棋中的马步:每次总是先横向移动 M1 (1 ≤ M1 ≤ 30)格,再纵向移动 M2 (1 ≤ M2 ≤ 30, M1≠M2

青铜莲花池

Farmer John为了满足宁智贤对美的享受而安装了人工湖.矩形的人工湖分成M行N列(1 <= M <= 30; 1 <= N <= 30)的方形小格子.有些格子有美丽的荷叶,有些有岩石,剩下的格子有的只是美丽的蓝色湖水.宁智贤通过从一片荷叶跳到另一片荷叶上来练习芭蕾.它现在正站在一片荷叶上(看输入数据了解具体位置).它希望通过在荷叶上跳跃来到达另一片荷叶.它既不能跳到水里也不能跳到岩石上.只有新手才会感到吃惊:宁智贤的跳跃有点类似国际象棋中马那样的移动,在一个方向上(如水平方向

【bfs】【中等难度】tyvj P1234 - bench与奔驰

P1234 - bench与奔驰 From zhangbh001    Normal (OI) 总时限:10s    内存限制:128MB    代码长度 限制:64KB P1234 - bench与奔驰 背景 Background 公园里有个人在练开奔驰 - -!,但是总是撞在bench上 (众人曰:狼来了,快跑啊!) 描述 Description 公园里的bench与奔驰都是无敌的,不会被撞坏.由于开奔驰的人比较"有特点",总是向上下左右四个方向开,而且只会在撞到椅子之后改变方向(

用OC实现实现中等难度通讯录详解

用OC实现中等难度通讯录.需求:      1.定义联系人类Contact.实例变量:姓名(拼音,?字?大写).性别.电话号码. 住址.分组名称.年龄.?法:?定义初始化方法或便利构造器方法.显?联系人信息      2.在main.m中定义字典,分组管理所有联系人.分组名为26个大写的英文字母.      3.可以添加联系?对象,如果姓名或电话号码为空,添加失败.添加联系?到匹配的分组.      4.获取某个分组名称下所有联系人,并且按照姓名升序排列.      5.从通讯录中根据电话号码搜

OC 通讯录 中等难度

Contact.h #import <Foundation/Foundation.h> @interface Contact : NSObject { NSString *_name; NSString *_gender; NSInteger _age; NSString *_address; NSString *_phoneNumber; NSString *_group; } - (void)setName:(NSString *)name; - (NSString *)name; - (

【快速幂+中等难度】Calculation 哈工大HITOJ2901

这些天好颓啊..都没有A题,只是各种等着填的坑..简直.. 这道题....其实是快速幂模板题..为了学习矩阵快速幂,顺手复习下快速幂... 哈工大的OJ其实还挺友好的.速度也快..赞一个.. 翻译 给你两个数A,B,要你求(1b + 2b + ... + ab) 这个式子mod a的结果.(b是奇数) 每行一组数据 (我以下的代码和解释都是用大写的A,B来代替原题小写a,b,代码中的小写a只是一个类似tmp的东西) 原题 http://acm.hit.edu.cn/hoj/problem/vie

bzoj1698 / P1606 [USACO07FEB]白银莲花池Lilypad Pond

P1606 [USACO07FEB]白银莲花池Lilypad Pond 转化为最短路求解 放置莲花的方法如果直接算会有重复情况. 于是我们可以先预处理和已有莲花之间直接互相可达的点,将它们连边(对,忽略它们). 于是剩下的就是边权为1的边了. 酱紫我们就成功转化为了边权问题. 蓝后跑跑最短路顺便计个数就解决了. 1 #include<iostream> 2 #include<cstdio> 3 #include<cstring> 4 #include<queue&

过中等难度题目.0310

  .   8  String to Integer (atoi)    13.9% Medium   . 151 Reverse Words in a String      15.7% Medium     . 288 Unique Word Abbreviation      15.8% Medium     . 29 Divide Two Integers      16.0% Medium     . 166 Fraction to Recurring Decimal      17.

poj 2251 Dungeon Master(三维BFS)(中等)

Dungeon Master Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 20598   Accepted: 7971 Description You are trapped in a 3D dungeon and need to find the quickest way out! The dungeon is composed of unit cubes which may or may not be filled