栈求解迷宫,输出全部路径,回溯

mgpath:

起点di和mg赋值-1
while {
i,j,di被当前St[top]赋值
之后寻找di(下一个可走)
找到后改top.di
top++把找到的新位置赋值给top的i,j
新的top.di赋值为-1,mg为-1
......
最后到终点输出
终点mg=0,top--
开始回溯找下一条路径
}

#include<iostream>
using namespace std;
#define M 4
#define N 4
#define MaxSize 100
int mg[M + 2][N + 2] = {
{1,1,1,1,1,1},
{1,0,0,0,1,1},
{1,0,1,0,0,1},
{1,0,0,0,1,1},
{1,1,0,0,0,1},
{1,1,1,1,1,1}}
;
struct {
	int i, j;
	int di;
} St[MaxSize], Path[MaxSize];
int top = -1;
int count = 1;
int minlen = MaxSize;
void dispapath() {
	int k;
	printf("%5d: ", count++);
	for(k = 0; k <= top; k++)
		printf("(%d, %d)", St[k].i, St[k].j);
	cout << endl;
}
void dispminpath() {
	
}
void mgpath(int xi, int yi, int xe, int ye) {
	int i, j, i1, j1, di; 
	bool find;			  
	top++; 
	St[top].i = xi;
	St[top].j = yi;
	St[top].di = -1; mg[xi][yi] = -1;
	while(top > -1) {
		i = St[top].i; j = St[top].j;
		di = St[top].di;
		if(i == xe && j == ye) {
			dispapath();
			mg[i][j] = 0;
			top--;
			i = St[top].i; j = St[top].j;
			di = St[top].di;
		}
		find = false;
		while(di < 4 && !find) {
			di++;
			switch(di) {
				case 0: i1 = i - 1; j1 = j; break;
				case 1: i1 = i; j1 = j + 1; break;
				case 2: i1 = i + 1; j1 = j; break;
				case 3: i1 = i; j1 = j - 1; break;
			}
			if(mg[i1][j1] == 0) find = true;
		}
		if(find) {
			St[top].di = di;
			top++; St[top].i = i1; St[top].j = j1;
			St[top].di = -1;
			mg[i1][j1] = -1;
		} else {
			mg[i][j] = 0;
			top--;
		}
	}
	dispminpath();
}
int main() {
	cout << "迷宫路径如下:" << endl;
	mgpath(1, 1, M, N);
}

栈求解迷宫,输出全部路径,回溯

栈求解迷宫,输出全部路径,回溯