【模拟B卷】5.迷宫问题求解

【反思】

1.巩固复习了回溯法

2.在写卷子的过程中没能解决路径输出的问题,此题有两种输出方式:

  • 用栈将路径存储起来,当遇到终点的时候统一输出
  • 将走过的足迹做标记,如标记为6,当遇到终点的时候将整个迷宫矩阵打印出来

3.如果还想要输出最短路径,可以每条路径及其长度存起来,在所有递归结束时再输出路径

【之前答案错误原因分析】

void MazePath(int i, int j)//输入起点
{
	if (maze[i][j] == 1 || maze[i][j] == 6)
		return;
	else
	{
		FootPrint(i,j);//错误原因分析:第一、起点在一开始输出后,就没有语句输出它了,所以不可能按照预想的输出路径
		               //第二、当输出第二条路径时,即使这条路径是错误的也会输出,这就是不能这样写的原因。

		if (maze[i][j] == 2)
		{
			return;
		}

		maze[i][j] = 6;
		int k;
		for (k = 0; k < 4; ++k)
			MazePath(i + direct[k][0], j + direct[k][1]);
		maze[i][j] = 0;

	}
}

【代码:存储路径法】

#include 
#include 
#include 
#include 
#include 
#define maxSize 100

int maze[maxSize][maxSize];//0表示通路,1表示墙,2表示出口
int end = 2;
int direct[4][2] = { {0,1},{0,-1},{1,0},{-1,0} };

typedef struct
{
	int i;
	int j;
}Foot;

Foot stack[maxSize];
int  top = -1;

void FootPrint()
{
	int k;
	for (k = 0; k <= top; ++k)
	{
		printf("(%d,%d) ", stack[k].i+1, stack[k].j+1);
	}
	printf("\n");
}

void MazePath(int i, int j)//输入起点
{
	if (maze[i][j] == 1)
		return;
	else
	{
		++top;
		stack[top].i = i;
		stack[top].j= j;

		if (maze[i][j] == 2)
		{
			FootPrint();
			return;
		}

		maze[i][j] = 1;
		int k;
		for (k = 0; k < 4; ++k)
			MazePath(i + direct[k][0], j + direct[k][1]);
		maze[i][j] = 0;
		--top;//易错点:不能漏,否则就不是回溯了
	}
}

void ReadData(int n)//读入的矩阵的列数,也可以不要,那就以读到换行符'\n'为标志进行换行
{
	FILE* fp;
	if ((fp = fopen("maze.txt", "r")) == NULL)
		exit(0);

	int i, j, tmp;
	i = 0, j = 0;
	
	while (fscanf(fp, "%d", &tmp) != EOF)//如果当前读入的数据不是结束标志,则进行赋值操作
	{
		maze[i][j] = tmp;

		if (j == n - 1)//当读入最后一列时换行
		{
			j = 0;
			i = i + 1;
		}
		else
		{
			j++;
		}
	}
	
}
int main()
{	
	ReadData(7);
	MazePath(1, 1);

	return 0;
}

【数据及结果】

【模拟B卷】5.迷宫问题求解_第1张图片

1 1 1 1 1 1 1
1 0 1 0 0 0 1
1 0 1 0 1 0 1
1 0 0 0 0 0 1
1 0 1 1 1 0 1
1 0 0 0 1 2 1
1 1 1 1 1 1 1 

【代码2:打印迷宫矩阵法】

#include 
#include 
#include 
#include 
#include 
#define maxSize 100

int maze[maxSize][maxSize];//0表示通路,1表示墙,2表示出口,6表示已走过的足迹
int end = 2;
int direct[4][2] = { {0,1},{0,-1},{1,0},{-1,0} };

void FootPrint()
{
	int i, j;
	for (i = 0; i < 7; ++i)
	{
		for (j = 0; j < 7; ++j)
		{
			printf("%d ", maze[i][j]);
		}
		printf("\n");
	}
	printf("\n");

}

void MazePath(int i, int j)//输入起点
{
	if (maze[i][j] == 1 || maze[i][j] == 6)
		return;
	else
	{
		if (maze[i][j] == 2)
		{
			FootPrint();
			return;
		}

		maze[i][j] = 6;
		int k;
		for (k = 0; k < 4; ++k)
			MazePath(i + direct[k][0], j + direct[k][1]);
		maze[i][j] = 0;

	}
}

void ReadData(int n)//读入的矩阵的列数,也可以不要,那就以读到换行符'\n'为标志进行换行
{
	FILE* fp;
	if ((fp = fopen("maze.txt", "r")) == NULL)
		exit(0);

	int i, j, tmp;
	i = 0, j = 0;
	
	while (fscanf(fp, "%d", &tmp) != EOF)//如果当前读入的数据不是结束标志,则进行赋值操作
	{
		maze[i][j] = tmp;

		if (j == n - 1)//当读入最后一列时换行
		{
			j = 0;
			i = i + 1;
		}
		else
		{
			j++;
		}
	}
	
}
int main()
{	
	ReadData(7);
	MazePath(1, 1);

	return 0;
}

【数据及结果】

【模拟B卷】5.迷宫问题求解_第2张图片

【模拟B卷】5.迷宫问题求解_第3张图片

你可能感兴趣的:(C语言,C语言与数据结构总结)