跳躍ios
第 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 }