啊哈算法—解救小哈(深度优先搜索)

解救小哈

小哈在一个(m * n)大小的迷宫(0 ⇐ m, n ⇐ 50)里迷路了。在迷宫中,每个单元格要么是空地,要么是障碍物。现在要找到从起点到小哈位置的最短步数。

思路:

使用递归一步一步向前试探,试探成功则步数加一,返回后向另一个方向试探,到达终点后比较最小步数。

源码:

#include

int n, m, p, q, min = _CRT_INT_MAX;
int a[51][51], book[51][51];

void dfs(x, y, step);

void dfs(x, y, step) {
	int next[4][2] = { {0, 1}, {1, 0}, {0, -1}, {-1, 0} };  //控制下一步走的方向
	int tx, ty;                                             //下一步坐标
	int 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 || tx > n || ty < 1 || 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;
	int startx, starty;

	printf("请输入迷宫大小\n");
	scanf("%d %d", &n, &m);            //输入迷宫大小

	printf("请输入迷宫\n");
	for (i = 1; i <= n; i++) {          //输入迷宫
		for (j = 1; j <= m; j++) {      
			scanf("%d", &a[i][j]);
		}
	}

	printf("请输入终点:");
	scanf("%d %d", &p, &q);            //输入终点;

	printf("请输入起点:");
	scanf("%d %d", &startx, &starty);

	dfs(startx, starty, 0);

	printf("最小路径:%d", min);	
	
	return 0;
}

你可能感兴趣的:(c语言)