題目描述
小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;
}