深度優先搜索(C++代碼實現)

深度優先搜索(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

相關文章
相關標籤/搜索