1. 程式人生 > >【資料結構】遞迴求解迷宮問題

【資料結構】遞迴求解迷宮問題

 資料結構 遞迴求解迷宮問題

參考程式碼如下:
/*
	名稱:遞迴求解迷宮問題
	編譯環境:VC++ 6.0
	日期: 2014年4月1日
*/
#include<stdio.h>
#include<windows.h>
// 迷宮座標位置型別
struct PosType 
{
	int x; // 行值 
	int y; // 列值 
};

#define MAXLENGTH 25 // 設迷宮的最大行列為25 
typedef int MazeType[MAXLENGTH][MAXLENGTH]; // [行][列] 

// 全域性變數 
struct PosType end;	// 迷宮終點位置 
MazeType m;			// 迷宮陣列 
int x, y;			// 迷宮行數,列數 

// 定義牆元素值為0,可通過路徑為-1,通過路徑為足跡 

// 輸出解
void Print(int x,int y)
{ 
	int i,j;
	for(i=0;i<x;i++)
	{
		for(j=0;j<y;j++)
			printf("%3d",m[i][j]);
		printf("\n");
	}
	printf("\n");
}

// 由當前位置cur、當前步驟curstep試探下一點
void Try(struct PosType cur,int curstep)
{
	int i;
	struct PosType next; // 下一個位置 
	// {行增量,列增量}
	struct PosType direc[4]={{0,1},{1,0},{0,-1},{-1,0}};
	// 移動方向,依次為東南西北 
	for(i=0;i<=3;i++) // 依次試探東南西北四個方向 
	{
		next.x=cur.x+direc[i].x;
		next.y=cur.y+direc[i].y;

		if(m[next.x][next.y] == -1) // 是通路 
		{
			m[next.x][next.y]=++curstep;
			if(next.x != end.x || next.y != end.y) // 沒到終點 
				Try(next,curstep); // 試探下一點(遞迴呼叫) 
			else
				Print(x,y); // 輸出結果 
			m[next.x][next.y]=-1; // 恢復為通路,試探下一條路 
			curstep--;
		}
	}
}

// 0為牆,-1為通道

int main()
{
	struct PosType begin;	//起點
	int i,j,x1,y1;

	printf("請輸入迷宮的行數,列數(包括外牆):(空格隔開)");
	scanf("%d%d",&x,&y);
	for(i=0;i<x;i++) // 定義周邊值為0(同牆) 
	{
		m[0][i]=0;	// 迷宮上面行的周邊即上邊牆 
		m[x-1][i]=0;// 迷宮下面行的周邊即下邊牆 
	}
	for(j=1;j<y-1;j++)
	{
		m[j][0]=0;	// 迷宮左邊列的周邊即左邊牆 
		m[j][y-1]=0;// 迷宮右邊列的周邊即右邊牆 
	}
	for(i=1;i<x-1;i++)
		for(j=1;j<y-1;j++)
			m[i][j]=-1; // 定義通道初值為-1 
	
	printf("請輸入迷宮內牆單元數(即牆的個數):");
	scanf("%d",&j);
	if(j)
		printf("請依次輸入迷宮內牆每個單元的行數,列數:(空格隔開)\n");
	for(i=1;i<=j;i++)
	{
		scanf("%d%d",&x1,&y1);
		m[x1][y1]=0;
	}
	printf("迷宮結構如下:\n");
	Print(x,y);
	printf("請輸入起點的行數,列數:(空格隔開)");
	scanf("%d%d",&begin.x,&begin.y);
	printf("請輸入終點的行數,列數:(空格隔開)");
	scanf("%d%d",&end.x,&end.y);
	m[begin.x][begin.y]=1;
	Try(begin,1); // 由第一步起點試探起 
	
	system("pause");
	return 0; 
}

/*
輸出效果:

請輸入迷宮的行數,列數(包括外牆):(空格隔開)4 4
請輸入迷宮內牆單元數(即牆的個數):1
請依次輸入迷宮內牆每個單元的行數,列數:(空格隔開)
1 2
迷宮結構如下:
  0  0  0  0
  0 -1  0  0
  0 -1 -1  0
  0  0  0  0

請輸入起點的行數,列數:(空格隔開)1 1
請輸入終點的行數,列數:(空格隔開)2 2
  0  0  0  0
  0  1  0  0
  0  2  3  0
  0  0  0  0

請按任意鍵繼續. . . 

*/

執行結果如下: