回溯算法,贪心算法之迷宫问题

问题描述:给定一个迷宫,入口为左上角,出口为右下角,问是否有路径从入口到出口,若有则输出一条这样的路径。

算法描述:

1.从入口开始,对下,右,上,左方向依次试探。若有路可走且没走过,则走。若无路可走则回溯回上一步继续试探

2.当走到出口时,输出该组路线并回溯回上一步寻找下一条路线

代码如下:

#include
#define R 7
#define C 7
int Move[4][2]={1,0,0,1,-1,0,0,-1};//下一步的方向 :move[0][]下move[1][]右move[2][]上move[3][]左;
int M[R+2][C+2]={{0,0,0,0,0,0,0,0,0},{0,1,1,0,1,0,0,0,0},{0,1,1,0,0,0,0,0,0},{0,0,1,1,0,0,0,0,0},
{0,1,0,1,1,0,0,0,0},{0,0,0,1,1,0,0,0,0},{0,0,0,0,1,1,1,0,0},{0,0,0,1,1,0,1,1,0},{0,0,0,0,0,0,0,0,0}};   //初始化迷宫,1为路,0为墙 
int Q[R+2][C+2]={0};
int stack[100][2];  //存放路线 
int top=0;  //栈顶 
int cnt=1;//找到解的累加器


void PrintWay(){
	int i=0; 
	printf("第%d条路线:",cnt++);//找到一组解累加一次
	for(;i ",stack[i][0],stack[i][1]);
	}
	printf("%d,%d  ",stack[i][0],stack[i][1]);
	printf("\n");
}


/*
函数作用:试探迷宫的所有路线 
函数参数:人当前的位置X,Y
无返回值 
*/
int Maze(int x,int y){
	if(x==7&&y==7){
		//如果走到出口,打印出迷宫的当前解  
		PrintWay();
	}else{           	//下右上左依次试探
		int a,b,i;
		for(i=0;i<4;i++){
			a=x+Move[i][0];
			b=y+Move[i][1];
			if(M[a][b]&&!Q[a][b]){  //如果该方向能走且没走过 
				Q[a][b]=1;
				top++; 
				stack[top][0]=a;
		  		stack[top][1]=b; 
				Maze(a,b);
				Q[a][b]=0;
				top--;    //出栈 
			}
		}
	
	}

}


//打印迷宫 
void PrintMaze(){
	for(int i=0;i<9;i++){
		for(int j=0;j<9;j++){
			printf("%d ",M[i][j]);
		}
		printf("\n");
	}
} 


int main(void){
	PrintMaze();   //打印迷宫 
	printf("\n");
	stack[0][0]=stack[0][1]=1; //入口(1,1)先入栈 
	M[1][1]=0;
	Maze(1,1);
} 

运行结果如下:

回溯算法,贪心算法之迷宫问题_第1张图片

你可能感兴趣的:(数据结构与算法)