Description
电脑游戏中有许多令人头疼的迷宫,会花费玩家相当多的时间你通过秘笈获得了游戏迷宫的地图,你希望找到最短
的一条走出迷宫的道路,并且想知道一共有多少条最短的道路,但是由于地图非常庞大,所以你不能在短时间找出
这些道路,因此,你需要编写一个程序来找出这些最短的道路,并且统计一下一共有多少条这样的道路。例如,对
于下图所示的迷宫:
…S
.XX.
.XX.
E…
X表示障碍物,不可以通过,S表示迷宫的入口,E表示迷宫的出口。
显然,从入口到出口至少需要走6步,而长度为6的道路一共有两条。
Input
第一行是一个整数n(1 ≤n ≤ 25),表示迷宫是一个n×n的矩阵。
以下n行每行有n个字符来描述地图,“.”表示可以通过,“X”表示
不可以通过,“S”表示迷宫的入口,“E”表示迷宫的出口。
(注意:所有的字母均为大写)。
Output
第一行包含一个整数,表示从入口到出口走的最短距离。
第二行包含一个整数,表示最短路径的条数,答案保证小于2^31。
Sample Input
4
...S
.XX.
.XX.
E...
Sample Output
6
2
HINT
每个点都有四个地方可以过来,将四个地方的最小值相加,就是那个地点的最小路径的个数了。
代码:
#include<bits/stdc++.h>
using namespace std;
int n,s[51][51][51],qx,qy,zx,zy;
bool u[51][51];
char c;
int main() {
memset(s,0,sizeof(s));
cin>>n;
for(int i=1; i<=n; i++)
for(int j=1; j<=n; j++) {
cin>>c;
switch(c) {
case 'X':
u[i][j]=false;
break;
case '.':
u[i][j]=true;
break;
case 'S':
qx=i,qy=j,u[i][j]=true;
break;
case 'E':
zx=i,zy=j,u[i][j]=true;
break;
}
}
s[0][qx][qy]=1;
for(int k=1;k>=0; k++)
for(int i=1; i<=n; i++)
for(int j=1; j<=n; j++) {
if(u[i][j]) {
s[k][i][j]+=s[k-1][i][j-1];
s[k][i][j]+=s[k-1][i-1][j];
s[k][i][j]+=s[k-1][i][j+1];
s[k][i][j]+=s[k-1][i+1][j];
}
if(s[k][zx][zy]) {
cout<<k<<endl<<s[k][zx][zy]<<endl;;
return 0;
}
}
return 0;
}