题目描述 Description
sb有一天和sml吵架了,她离家出走,走到了一个a*a的正方形里,她迷路了!
A为入口,
B为sb。
正在此时,sml来到了迷宫入口,他和她都很着急,求最快要x步(从入口进,从入口出)(要*2)
‘0’为水,‘1’为路,‘2’为障碍物,‘3’为草地(可以走)。‘4’为树(也走不了),‘5’为石头(可以走)
输入描述 Input Description
a
a*a个数(A,B也在内)
输出描述 Output Description
x(A,B只统计1次)
样例输入 Sample Input
5
0 0 0 0 A
1 1 1 1 1
3 2 4 1 0
5 5 5 5 0
0 0 0 3 B
//画横线的为路径!
样例输出 Sample Output
12
数据范围及提示 Data Size & Hint
a<=500
对于30%的数据只有“1”和“0”。
对于60%的数据没有“3”和“5”
对于100%的数据,路程>=10.
当行不通时“printf(“NoNE!”);
#include<cstdio>
#include<iostream>
using namespace std;
int sum=0,n,ff=0,x[5]={0,1,0,0,-1},y[5]={0,0,1,-1,0},f[501][501],xx[501],yy[501];
int ans[501][501];
char map[501][501];
int main()
{
int sbx,sby;
scanf("%d",&n);
for (int i=1;i<=n;i++)
for (int j=1;j<=n;j++)
{
char r;
f[i][j]=1;
cin>>r;
map[i][j]=r;
if (r=='A') {
xx[1]=i;
yy[1]=j;
f[i][j]=0;
}
if (r=='B'){
sbx=i;
sby=j;
}
if (r=='2'||r=='4'||r=='0') f[i][j]=0;
}
int head=0,tail=1;
while (head!=tail)
{
head++;
int aa=xx[head],bb=yy[head];
for (int i=1;i<=4;i++)
{
int a=xx[head]+x[i],b=yy[head]+y[i];
if (f[a][b]&&a<=n&&a>0&&b<=n&&b>0)
{
f[a][b]=0;
xx[++tail]=a;
yy[tail]=b;
ans[a][b]=ans[aa][bb]+1;
if (a==sbx&&b==sby)
{
ff=1;
break;
}
}
}
}
if (ff) cout<<ans[sbx][sby]*2;
else cout<<"NoNE!";
}