如下圖所示的是乙個由程式設計題目組成的acm迷宮。迷宮的左上角是入口,右下角是出口。迷宮中每乙個格仔都有乙個程式設計題目,挑戰者要ac該題目後才能通過,大於0的數字表示ac該題目所需的最短時間。數字如果是0表示是陷阱,進去了就出不來。現在的問題是:求挑戰者從入口到出口所需的最短時間。
有多組測試例項。
對於每組測試例項,先輸入乙個數字n(1對應輸出挑戰者從入口到出口所需的最短時間。
101 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 迷宮問題常用...