乐逍遥xwl

导航

F-跳跃 牛客假日团队赛2

跳跃

题目描述

Farmer John为了满足奶牛对美的享受而安装了人工湖。矩形的人工湖分成M行N列(1 <= M <= 30; 1 <= N <= 30)的方形小格子。有些格子有美丽的荷叶,有些有岩石,剩下的格子有的只是美丽的蓝色湖水。
Bessie通过从一片荷叶跳到另一片荷叶上来练习芭蕾。它现在正站在一片荷叶上(看输入数据了解具体位置)。它希望通过在荷叶上跳跃来到达另一片荷叶。它既不能跳到水里也不能跳到岩石上。
只有新手才会感到吃惊:Bessie的跳跃有点类似国际象棋中马那样的移动,在一个方向上移动M1(1 <= M1 <= 30)“格”,然后再在斜方向上移动M2 (1 <= M2 <= 30; M1 != M2)格(或者也许在一个方向上移动M2格,然后在斜方向上移动M1格)。Bessie有时可能有多达8中的跳跃选择。
给出池塘的构造以及Bessie跳跃的形式,找出Bessie从一个位置移动到另一个位置所需的最小的跳跃次数。这个跳跃对于所给的测试数据总是可能的。

输入描述:

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

输出描述:

第 1 行: 一个整数,是Bessie从一块荷叶跳到另一块荷叶所需的最小的跳跃数。

输入

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

输出

2

说明

Bessie在第二行的左边开始;她的目的地在第二行的右边。池塘中有几块荷叶和岩石。
Bessie聪明的跳到了(1,3)的荷叶上,再跳到目的地。


思路:这题我狂WA了,刚开始读错题了,明明不是国际象棋马的走法,为何非要扯上关系??(我还去百度了)可能是我太菜了orzorz,写下这篇博客当教训了。
正确走法就是一共八种走法,就是上下和左右一定会走一个值,可能m1,或m2,
比如上m1,右m2->(x+m2,y+m1)或下m2,左m1->(x-m1,y-m2)
画个图就知道是八种了,这题我写dfs tle了,可能写挂了,然后用的bfs,考虑到能走的点不多,bfs更快......


  1 #include<iostream>
  2 #include<cstdio>
  3 #include<cstring>
  4 #include<cmath>
  5 #include<algorithm>
  6 #include<map>
  7 #include<set>
  8 #include<vector>
  9 #include<queue>
 10 using namespace std;
 11 #define ll long long
 12  
 13 const int maxn=101;
 14 
 15 int e[maxn][maxn];
 16  
 17 int book[maxn][maxn];
 18  
 19 int n,m,go1,go2;
 20  
 21 int startx,starty;
 22  
 23 int minn;
 24 
 25 typedef struct
 26 {
 27     int x;
 28     int y;
 29     int cnt;
 30 } St;
 31  
 32 queue<St>q;
 33  
 34  
 35 int main()
 36 {
 37     ios::sync_with_stdio(false);cin.tie(0);cout.tie(0);
 38      
 39     cin>>n>>m>>go1>>go2;
 40      
 41     for(int i=1;i<=n;i++)
 42     {
 43         for(int j=1;j<=m;j++)
 44         {
 45             cin>>e[i][j];
 46             if(e[i][j]==0||e[i][j]==2)
 47                 e[i][j]=0;
 48             else if(e[i][j]==3)
 49             {
 50                 startx=i;
 51                 starty=j;
 52             }
 53         }
 54     }
 55      
 56     minn=inf;
 57      
 58     book[startx][starty]=1;
 59      
 60     St now;
 61      
 62     now.x=startx;
 63     now.y=starty;
 64     now.cnt=0;
 65      
 66     q.push(now);
 67      
 68     while(!q.empty())
 69     {
 70         now=q.front();
 71         int x=now.x;
 72         int y=now.y;
 73         int f=now.cnt;
 74         int tx,ty;
 75         for(int i=0;i<8;i++)
 76         {
 77             if(i==0)
 78                 tx=x+go1,ty=y+go2;
 79             else if(i==1)
 80                 tx=x+go2,ty=y+go1;
 81             else if(i==2)
 82                 tx=x-go1,ty=y+go2;
 83             else if(i==3)
 84                 tx=x-go2,ty=y+go1;
 85             else if(i==4)
 86                 tx=x+go1,ty=y-go2;
 87             else if(i==5)
 88                 tx=x+go2,ty=y-go1;
 89             else if(i==6)
 90                 tx=x-go1,ty=y-go2;
 91             else if(i==7)
 92                 tx=x-go2,ty=y-go1;
 93                      
 94             if(tx<1||tx>n||ty<1||ty>m)
 95                 continue;
 96          
 97             if(e[tx][ty]==0)
 98                 continue;
 99          
100             if(!book[tx][ty])
101             {
102                 book[tx][ty]=1;        
103                 now.x=tx;
104                 now.y=ty;
105                 now.cnt=f+1;
106                  
107                 if(e[tx][ty]==4)
108                     return cout<<now.cnt<<endl,0;
109                  
110                 q.push(now);
111                  
112             }
113         }
114         q.pop();
115     }
116 }

 

 

posted on 2019-06-17 18:45  乐逍遥xwl  阅读(160)  评论(0编辑  收藏  举报