1. 程式人生 > >走出迷宮(C程式設計進階第9周)

走出迷宮(C程式設計進階第9周)

問題描述
當你站在一個迷宮裡的時候,往往會被錯綜複雜的道路弄得失去方向感,如果你能得到迷宮地圖,事情就會變得非常簡單。
假設你已經得到了一個n*m的迷宮的圖紙,請你找出從起點到出口的最短路。
輸入
第一行是兩個整數n和m(1 <= n,m <= 100),表示迷宮的行數和列數。
接下來n行,每行一個長為m的字串,表示整個迷宮的佈局。字元’.’表示空地,’#’表示牆,’S’表示起點,’T’表示出口。
輸出
輸出從起點到出口最少需要走的步數。(你不能起出迷宮外)
樣例輸入

3 3
S#T
.#.
...

樣例輸出

6

提示
此題預設是至少有一條路線可以走出的
原始碼1是抄別人的,沒搞懂,好像會把所有的路都遍歷一遍。寫的很高深,測試通過
原始碼2是自己寫的,測試不通過,但一直找不出問題所在,日後再找。
原始碼


原始碼1:

#include <iostream>
#include <cstring>
using namespace std;

int m,n;//n行m列
char map[101][101];//地圖矩陣
int already[101][101];//已走地圖記憶
int min_count=0;

void cross(int u, int v, int i, int j)
{
    int t = already[u][v];
    if (u == i && v == j)//起點即為到達終點
    {
        min_count = t;
    }
    t++;

    if
(v < m - 1 && map[u][v+1] != '#' && already[u][v+1]>t)//在迷宮內、右側非牆且此點沒有走過 { already[u][v+1] = t;//標記此點為第t步 cross(u, v+1, i, j);//以此點為起點繼續走 } if (u > 0 && map[u-1][v] != '#' && already[u-1][v]>t) { already[u-1][v] = t; cross(u-1
, v, i, j); } if (v > 0 && map[u][v-1] != '#' && already[u][v-1]>t) { already[u][v-1] = t; cross(u, v-1, i, j); } if (u < n - 1 && map[u+1][v] != '#' && already[u+1][v]>t) { already[u+1][v] = t; cross(u+1, v, i, j); } } int main() { int startx,starty,endx,endy; cin >> n >> m ; for (int i=0; i<n ; i++) { for (int j=0; j<m; j++) { cin >> map[i][j]; if (map[i][j]=='S') { startx=i; starty=j; } if (map[i][j]=='T') { endx=i; endy=j; } } } memset(already,1,sizeof(already));//按位元組為單位賦值:16843309 already[startx][starty]=0; cross(startx,starty,endx,endy); cout <<min_count<<endl; return 0; }

原始碼2:

#include <iostream>
using namespace std;

int Row, Column;
char map[101][101] = {'\0'};
int f(int x, int y)//起點座標x,y
{
    if (x<0 || y<0 || x>=Row || y>=Column)//起點不在迷宮內
    {
        return -1;//記為無窮大,不可能實現
    }
    if (map[x][y] == '#')//此點不可作為起點
    {
        return -1;
    }
    else if (map[x][y] == 'T')//起點即為終點
    {
        return 0;
    }
    else
    {
        map[x][y] = '#';//將起點置為不可走,以免陷入無限迴圈
        int Step[4];
        Step[0] = f(x-1, y);    
        Step[1] = f(x+1, y);
        Step[2] = f(x, y-1);
        Step[3] = f(x, y+1);
        for (int i = 0; i < 3; i++)//從小到大排序
        {
            for (int j = i+1; j < 4; j++)
            {
                if (Step[i]>Step[j])
                {
                    int tmp = Step[i];
                    Step[i] = Step[j];
                    Step[j] = tmp;
                }
            }
        }
        int min;        
        for (int i = 0; i < 4; i++)//找出最小值
        {
            if (Step[i] != -1)
            {
                min = Step[i];
                map[x][y] = '.';//恢復起點
                return min+1;//返回所需最少部數
            }
        }       
    }
    return -1;
}

int main()
{   
    cin >> Row >> Column;   
    int x,y;
    for(int i = 0; i < Row; i++)
    {
        for (int j = 0; j < Column; j ++)
        {
            cin >> map[i][j];
            if (map[i][j] == 'S')//找出起點
            {
                x = i;
                y = j;
            }
        }
    }   
    int MinStep = f(x, y);
    cout << MinStep << endl;
    return 0;
}