走出迷宮(C程式設計進階第9周)
阿新 • • 發佈:2019-02-04
問題描述
當你站在一個迷宮裡的時候,往往會被錯綜複雜的道路弄得失去方向感,如果你能得到迷宮地圖,事情就會變得非常簡單。
假設你已經得到了一個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;
}