HNUST 挑戰ACM迷宮(DFS版)

2021-08-22 19:14:10 字數 1341 閱讀 1742

如下圖所示的是乙個由程式設計題目組成的acm迷宮。迷宮的左上角是入口,右下角是出口。迷宮中每乙個格仔都有乙個程式設計題目,挑戰者要ac該題目後才能通過,大於0的數字表示ac該題目所需的最短時間。數字如果是0表示是陷阱,進去了就出不來。現在的問題是:求挑戰者從入口到出口所需的最短時間。

有多組測試例項。

對於每組測試例項,先輸入乙個數字n(1對應輸出挑戰者從入口到出口所需的最短時間。

10

1 0 2 1 2 3 4 2 2 5

2 1 0 1 3 2 5 7 2 1

1 1 1 0 1 1 1 3 2 3

1 2 1 1 0 1 1 1 2 3

1 1 2 0 2 0 2 3 2 3

2 2 2 2 3 2 0 2 3 2

3 2 2 2 1 1 1 0 1 1

0 1 1 3 0 1 1 2 3 2

2 0 1 1 2 2 2 2 2 2

3 2 3 2 3 2 3 2 3 2

51 2 1 2 5

1 3 2 4 5

2 1 0 2 5

2 1 1 2 1

2 4 1 1 2

min=29

min=11

題意:就是從起點走到終點,求最短路

解題思路:我用的是dfs,當然也可以bfs,甚至dp。dfs有4個方向,採用記憶化搜尋,記錄每乙個點的最短路路徑,當然,這樣還是會超時。再網dfs引數中加乙個sum,表示當前的步數,如果大於ans就終止。最後要注意,要把迷宮中的0設為不可以走的牆壁,別設定為乙個很大的數,否則dfs還是會搜尋下去。

#include using namespace std;

int n;

int z[110][110];

int vis[110][110];

int dir[4][2]=;

int ans;

void dfs(int x,int y,int sum)//加乙個sum是用來剪枝的

if(sum>ans) return ;//當前這點的和已經大於終點的了,直接剪去

for(int i=0;i<4;i++)

else if(vis[xx][yy]>z[xx][yy]+vis[x][y])//該點被訪問過了,但是不是最優}}

}int main()

vis[1][1]=z[1][1];

ans=100000;

dfs(1,1,z[1][1]);

printf("min=%d\n",vis[n][n]);//ans和vis[n][n]是一樣的

}return 0;

}

ACM 迷宮問題

使用dfs的方法對所有路徑進行遍歷,當某路徑可以到達終點時,使用乙個向量儲存路徑,並使用乙個陣列儲存他的路徑長度,最後輸出路徑最短的路徑。include include include using namespace std int m,n int vis 5 5 int f 4 2 左,上,右,下...

ACM 迷宮問題

定義乙個二維陣列 int maze 5 5 它表示乙個迷宮,其中的1表示牆壁,0表示可以走的路,只能橫著走或豎著走,不能斜著走,要求程式設計序找出從左上角到右下角的最短路線。input 乙個5 5的二維陣列,表示乙個迷宮。資料保證有唯一解。output 左上角到右下角的最短路徑,格式如樣例所示。sa...

迷宮問題dfs

迷宮問題 棧作為深度優先遍歷 dfs 採用的搜尋方法的特點是盡可能先對縱深方向進行搜尋 可以最快的找到解 include define m 8 define n 8 define maxsize 1000 typedef struct box typedef struct sttype 迷宮問題常用...