迷宫问题(DFS)

输入数据中, 0表示不能通过,1为可以通过,2为起点,3为终点。

例子数据如下:

6 6
2 0 0 0 0 0
1 1 1 1 1 1
0 1 0 1 0 1
0 1 0 1 0 1
1 1 1 0 1 3
0 0 1 1 1 0

第一行的 6 6 表示输入矩形的宽和高。

代码实现如下:

#include <stdio.h>
#include <string.h>


struct element
{
	int value;
	int visit;
};

#define MAX_W	100
#define MAX_H	100

struct element data[MAX_W][MAX_H];

int start_x, start_y;
int end_x, end_y;

int M, N;
struct point
{
	int x, y;
};
struct point solution[MAX_W * MAX_H];
int idx;

#define is_safe(x,y)	((x) < M && (y) < N && (x) >= 0 && (y) >= 0 && data[x][y].value == 1 && data[x][y].visit == 0)


void print_result(void)
{
	int i = 0;
	while (i <= idx)
	{
		printf("(%d,%d)", solution[i].x, solution[i].y);
		if(i < idx)
		{
			printf("-->");
		}
		i++;
	}
	printf("\n");
}

void search(int x, int y)
{
	if(x == end_x && y == end_y)
	{
		printf("path found!\n");
		print_result();
		return;
	}
	
	 if(is_safe(x+1, y))
	{
		data[x+1][y].visit = 1;
		idx++;
		solution[idx].x = x + 1;
		solution[idx].y = y;
		search(x+1, y);
		return;
	}
	else if(is_safe(x-1, y))
	{
		data[x-1][y].visit = 1;
		idx++;
		solution[idx].x = x -1 ;
		solution[idx].y = y;
		search(x-1, y);	
		return;
	}
	//search rightward
	else if(is_safe(x, y+1))
	{
		data[x][y+1].visit = 1;
		idx++;
		solution[idx].x = x;
		solution[idx].y = y + 1;
		search(x, y+1);
		return;
	}
	else if(is_safe(x, y - 1))
	{
		data[x][y-1].visit = 1;
		idx++;
		solution[idx].x = x;
		solution[idx].y = y - 1;
		search(x, y -1);
		return;
	}

	
	data[x][y].visit == 0;
	idx--;
}

int main(int argc, char **argv)
{
	FILE *fp = freopen("data.txt", "r", stdin);
	if(fp == NULL)
	{
		return -1;
	}

	scanf("%d %d", &M, &N);
	
	memset(data, 0, sizeof(data));

	int i, j;
	for(i = 0; i < M; i++)
	{
		for(j = 0; j < N; j++)
		{
			scanf("%d", &data[i][j].value);
			if(data[i][j].value == 2)
			{
				start_x = i;
				start_y = j;
			}
			else if(data[i][j].value == 3)
			{
				end_x = i;
				end_y = j;
				data[i][j].value = 1;
			}
		}
	}

	data[start_x][start_y].visit = 1;
	idx = 0;
	solution[idx].x = 0;
	solution[idx].y = 0;
	search(start_x, start_y);

	return 0;
}

输出:

(0 0)-->(1 0)-->(1 1)-->(2 1)-->(3 1)-->(4 1)-->(4 2)-->(5 2)-->(5 3)-->(5 4)-->(4 4)-->(4 5)

这种方法只能找到一个路径,而且不能保证是最短的。

References:

1. http://www.geeksforgeeks.org/backttracking-set-2-rat-in-a-maze/

2. https://www.cs.bu.edu/teaching/alg/maze/

3. https://courses.cs.washington.edu/courses/cse143/12wi/lectures/02-17/17-recursive-backtracking-2.pdf

    原文作者:迷宫问题
    原文地址: https://blog.csdn.net/CaspianSea/article/details/51472093
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞