生活随笔
收集整理的這篇文章主要介紹了
魔兽世界
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
題目描述
小A在WOW中是個小術士.作為一名術士,不會單刷副本是相當丟臉的.所謂單刷副本就是單挑BOSS了,這么有榮譽感的事小A怎么會不做呢?于是小A來到了厄運之槌開始了單刷.小A看了看,厄運之槌的地圖是一個N*M的矩形(N,M<=100),上面遍布了小怪和傳送門.例如(1表示有小怪,0表示無小怪,大寫字母表示傳送門,傳送門:例如,走到 B 傳送門點將傳送到另一個 B 傳送點(次數無限,但每次進入傳送點只傳送過去,不會在傳送回來)數據保證每個傳送門有且僅有相對應的另一個傳送門):
而入口在左上方(1,1),BOSS卻躲在右下方(N,M).小A非常急切的想要完成單刷然后去向其他那些戰士啊盜賊啊不會單刷的職業炫耀炫耀,所以呢,小A絕不會在小怪身上浪費時間(當然是繞開他們),并且想通過傳送門盡快到達BOSS身邊.看啊看,想啊想,還是沒找出最快的路.終于,靈機一動,想什么啊,編程唄!
[樣例說明] 路線如圖:
輸入
第一行2個數據:n m; 下面n行,每行m個數(入口點和BOSS點無怪和傳送門),表示厄運之槌的地圖。地圖數據之間無空格。每步只能走一格,方向上下左右。左上角為入口點,右下角為出口點. 輸出
一個整數,表示小A最少需要走多少步。如果小A不能走到目標,則輸出No Solution. 輸入樣例
3 4 0000 00A0 A000 輸出樣例
4
說明
對60%的數據,n,m<=20 對100%的數據,n,m<=100 . . . . .程序:
#include<iostream>
#include<cstdio>int d[4][2]={{-1,0},{0,-1},{0,1},{1,0}};
char vis[101][101],map[101][101];
int n,m,q[20001][2],dist[101][101],g[30][4];void bfs()
{int t,x0,y0,x,y;q[0][0]=q[0][1]=1;vis[1][1]=1;dist[1][1]=0;for (int l=0,r=1;l<r;l++){x0=q[l][0];y0=q[l][1];for (int i=0;i<4;i++){x=x0+d[i][0];y=y0+d[i][1];if (map[x][y]){t=map[x][y];if (t>1){if (g[t][0]==x&&g[t][1]==y){x=g[t][2];y=g[t][3];} else{x=g[t][0];y=g[t][1];}}if (vis[x][y]) continue;dist[x][y]=dist[x0][y0]+1;q[r][0]=x;q[r][1]=y;vis[x][y]=1;r++;}}}
}int main()
{scanf("%d%d",&n,&m);for (int i=1;i<=n;i++){scanf("%s",&map[i][1]);for (int j=1;map[i][j];j++)if (map[i][j]<60) map[i][j]=49-map[i][j]; else{map[i][j]-=63;int t=map[i][j];if (g[t][0]==0){g[t][0]=i;g[t][1]=j;} else{g[t][2]=i;g[t][3]=j;}}}for (int i=1;i<=n;i++)for (int j=1;j<=m;j++) dist[i][j]=2147483647;bfs();if (dist[n][m]==2147483647) printf("No Solution."); else printf("%d",dist[n][m]);return 0;
}
轉載于:https://www.cnblogs.com/YYC-0304/p/10292844.html
總結
以上是生活随笔 為你收集整理的魔兽世界 的全部內容,希望文章能夠幫你解決所遇到的問題。
如果覺得生活随笔 網站內容還不錯,歡迎將生活随笔 推薦給好友。