F-跳躍 牛客假日團隊賽2

跳躍ios

題目描述

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 }
相關文章
相關標籤/搜索