【DP】迷宫游戏(C++)

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;
}
原创文章 75 获赞 126 访问量 1万+

猜你喜欢

转载自blog.csdn.net/liuzich/article/details/103877287
今日推荐