#數據結構# 棧 求解迷宮問題

typedef struct{
	int i;	//當前方位的行號 
	int j;	//當前方位的列號 
	int di;	//下一可走相鄰方位的方位號 
} Box;  //存儲方塊
typedef struct{
	Box data[MaxSize];
	int top;	//棧頂指針 
} StType;  //存儲路徑
bool mgpath(int xi,int yi,int xe,int ye){
	int i,j,k,di,find;
	StType st;
	st.top=-1;
	st.top++;
	st.data[st.top].i=xi;
	st.data[st.top].j=yi;
	st.data[st.top].di=-1;
	mg[xi][yi]=-1;
	while(st.top>-1){ //棧不空時循環 
		i=st.data[st.top].i;
		j=st.data[st.top].j;
		di=st.data[st.top].di;
		if(i=xe&&j=ye){ //找到了出口,輸出路徑 
			printf("路徑如下:\n");
			for(k=0;k<st.top;k++){
				printf("\t [%d, %d]",st.data[k].i,st.data[k].j);
				if((k+1)%5==0){
					printf("\n");
				}
			} 
			printf("\n");
			return true
		}
		find=0;
		while(di<4&&find==0){ //尋徑 
			di++;
			switch(di){
				case 0:i=st.data[st.top].i-1; //di爲0 向左走一格 
						j=st.data[st.top].j;
						break;
				case 1:i=st.data[st.top].i;  //di爲1 向上走一格 
						j=st.data[st.top].j+1;
						break;
				case 2:i=st.data[st.top].i+1;	//di爲2 向右走一格 
						j=st.data[st.top].j;
						break;
				case 3:i=st.data[st.top].i;		//di爲3 向下走一格 
						j=st.data[st.top].j-1;
						break;
			}
			if(mg[i][j]==0){
				find=1; //找到一個可走的方塊【i,j】 
			}
		}
		if(find==1){
			st.data[st.top].di=di; //修改原棧頂元素的方向值 
			st.top++; //下一個可走方塊進棧 
			st.data[st.top].i=i;
			st.data[st.top].j=j;
			st.data[st.top].di=-1; //下一個可走方塊的di值置爲-1 
			mg[i][j]=-1; //避免重複走到此方塊 
		} 
		else{
			mg[st.data[st.top].i][st.data[st.top].j]==0;//將該位置變成其他位置可走方塊,而不是置爲-1 
			st.top--; //退棧 
		} 
		
	}	
	return false; //表示沒有可走路徑,返回false 
} 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章