深度優先搜索(C++代碼實現)
舉個例子,好比如今你的位置爲(1,1),你須要移動到一個位置(n,m),
而且路途中有多個障礙物阻擋你的前進,求出最少須要移動的次數。
ios
對於這個問題,咱們能夠使用從起點開始順時針進行移動(即:先向右,再向下,再 向左,再向上)。而且使用二維數組模擬一下地圖。當碰到障礙物的時候進行優先的 順時針的方向(右->下->左->上)總有一條路能走通,就接着繼續走,直到目的地, 這是其中的一條可行的路,而後就模擬全部的路,找到最短的那條便可。
OK,分析完畢,開始寫代碼:數組
#include<iostream> using namespace std; int n, m, p, q, min = 999999; int a[51][51], book[51][51]; void dfs(int x, int y, int step) {//其中的座標爲第x行的第y列,即(x,y),左上角即爲(1,1) int next[4][2] = { {0,1},//向右 {1,0},//向下 {0,-1},//向左 {-1,0}//向上 }; int tx, ty, k; //判斷是否到達目的地 if (x == p && y == q) { if (step < min) { min = step; return; } } for (k = 0; k <= 3; k++) { tx = x + next[k][0]; ty = y + next[k][1]; //不能越界 if (tx<1||ty<1||tx>n||ty>m) { continue; } if (a[tx][ty]==0&&book[tx][ty]==0) { book[tx][ty] = 1;//標記一下,走過了 dfs(tx, ty, step + 1); book[tx][ty] = 0;//等到嘗試完,取消標記這個點 } } return; } int main() { int i, j, starX, starY; cin >> n >> m; for (i = 1; i <= n; i++) { for (j = 1; j <= m; j++) { cin >> a[i][j];//輸入地圖 } } cin >> starX >> starY >> p >> q;//輸入起點和終點的行列座標 book[starX][starY] = 1;//標記起點已經走過 dfs(starX, starY, 0); cout << min; return 0; }
等會兒再更新廣度優先搜索。spa