迷宮的最短路徑一般來說用bfs做,但是也可以用dfs做,如果最優路徑只有一條的話,窮盡所有的路徑然後找出路徑最短的就好了。
不廢話,先上bfs**,這個**中,用到了每乙個位置的前驅節點,需要記住。然後逆著路徑列印出來。
#include#include#includeusing namespace std;
typedef pairpii;
void bfs(int a[10][10], int m, int n,int i, int j, pii pre[10][10])
); }
while (!q.empty())
); if (tmp.first + 1 == m - 1 && tmp.second == n - 1)
break;
} if (tmp.second + 1 < n && a[tmp.first][tmp.second + 1] == 0)
);if (tmp.first == m - 1 && tmp.second + 1 == n - 1)
break;
} if (tmp.first - 1 >= 0 && a[tmp.first - 1][tmp.second] == 0)
);if (tmp.first - 1 == m - 1 && tmp.second == n - 1)
break;
} if (tmp.second - 1 >= 0 && a[tmp.first][tmp.second - 1] == 0)
);if (tmp.first == m - 1 && tmp.second - 1 == n - 1)
break;
} a[tmp.first][tmp.second] = 1; }}
void print(pii res[100], pii pre[10][10],int m,int n,int i,int j)
// 順序輸出結果
while (count >= 0)
}int main()
pii res[100];
pii pre[10][10] ;
for (int i = 0; i < m; i++)
bfs(a, m, n, 0,0, pre);
print(res, pre, m, n, 0,0);
/*for (int i = 0; i < m; i++)
*/} return 0;
}
下面寫兩種dfs的**:
方法1:樸素的dfs
#include#includeusing namespace std;
typedef pairpii;
void dfs(int &min_t, int a[10][10], int m, int n, int i, int j, vectortmp, vector> visited, vector> &res)
dfs(min_t,a, m, n, i + 1, j, tmp, visited, res);
dfs(min_t,a, m, n, i - 1, j, tmp, visited, res);
dfs(min_t,a, m, n, i, j + 1, tmp, visited, res);
dfs(min_t,a, m, n, i, j - 1, tmp, visited, res);
}int main()
}vectorres;
vector> visited(m, vector(n, false));
vector> ret;
int min_t = 101;
dfs(min_t ,a, m, n, 0, 0, res, visited, ret);
for (int i = 0; i < ret.size(); i++)}}
}system("pause");
return 0;
}
方法2:
#include#includeusing namespace std;
int n, m; //分別代表行和列
vector> maze;//迷宮矩陣
vector> path_temp;//儲存當前路徑,第一維表示位置
vector> path_best;//儲存最佳路徑
void mazetrack(int i, int j)
);//將當前節點加入到路徑中
if (i == n - 1 && j == m - 1) //判斷是否到達終點
if (path_best.empty() || path_temp.size() < path_best.size())
path_best = path_temp;
if (i - 1 >= 0 && maze[i - 1][j] == 0)//探索向上走是否可行
mazetrack(i - 1, j);
if (i + 1 < n && maze[i + 1][j] == 0)//探索向下走是否可行
mazetrack(i + 1, j);
if (j - 1 >= 0 && maze[i][j - 1] == 0)//探索向左走是否可行
mazetrack(i, j - 1);
if (j + 1 < m && maze[i][j + 1] == 0)//探索向右走是否可行
mazetrack(i, j + 1);
maze[i][j] = 0; //恢復現場,設為未走
path_temp.pop_back();
}int main()
return 0;
}
迷宮最短路徑問題
問題描述 給定乙個迷宮和乙個起點乙個終點,求起點到終點的最短路徑長度。sample input 說明 5行5列的迷宮,為牆,為路,起點為 0,3 終點為 4,4 sample output 若不可達輸出 1 解答 用bfs的方法,借助乙個佇列實現。1 include2 include3 includ...
迷宮問題 最短路徑問題
給定乙個 n nn n 的二維陣列,如下所示 int maze 5 5 它表示乙個迷宮,其中的1表示牆壁,0表示可以走的路,只能橫著走或豎著走,不能斜著走,要求程式設計序找出從左上角到右下角的最短路線。資料保證至少存在一條從左上角走到右下角的路徑。輸入格式 第一行包含整數 n。接下來 nn 行,每行...
迷宮最短路徑
include include using namespace std const int max n 100,max m 100 const int inf 100000000 使用pair表示狀態時,使用typedef會更加方便一些 typedef pairp 輸入 char maze max ...