迷宫问题--DFS

312 阅读1分钟

问题描述:

标题
迷宫问题  
时间限制
1 S 
内存限制
10000 Kb 

问题输入 
一组数据,输入数据第1行为两个正整数m和n,m表示迷宫高度,n表示迷宫宽度,m<100,n<100;第2行为两个整数,分表表示起点的行列位置;第3为两个整数,分别表示终点的行列位置;其后为m行数据,每行n个整数,表示迷宫对应位置的状态,0表示通路,1表示障碍。
 
问题输出 
以三元组形式输出从起点到终点搜索到的第一条通路,没有则输出no 

输入样例 
8 8
1 1
8 8
0 0 1 0 0 0 1 0
0 0 1 1 0 0 1 0 
0 0 0 0 1 1 0 0
0 1 1 1 0 0 0 0
0 0 0 1 1 0 0 0
0 1 0 0 0 1 0 0
0 1 1 1 0 1 1 0
1 1 0 0 0 0 0 0
 
输出样例 
(1,1,1),(1,2,2),(2,2,2),(3,2,3),(3,1,2),(4,1,2),(5,1,1),(5,2,1),(5,3,2),(6,3,1),(6,4,1),(6,5,2),(7,5,2),(8,5,1),(8,6,1),(8,7,1),(8,8,1) 

解题思路: 使用STL中的栈结构,并利用递归和DFS一步步搜索,四个方向不断探索。

源代码

#include<cstdio> 
#include<iostream>
#include<algorithm>
#include<stack>
using namespace std;
struct base{
	int x,y,dir;
};
	int d[4][2]={{0,1},{1,0},{0,-1},{-1,0}};	//依据题意先后搜索的四个方向,右,下,左,上 
	stack<base> s;
	int m,n,a[1000][1000];  //在main函数外定义a[1000][1000]不然内存不够 
	int startx,starty,endx,endy;
	base now;
	int flag=0;	//flag=1表示已经找到终点,不需要在搜索,剪枝想法 
void digui(){
	if(flag==1){
		return;
	}
	now=s.top();
	for(int i=0;i<4;i++){		//四个边界为特殊情况,要特殊处理 
		if(flag==1){
		return;
	}
		if(now.x==1&&i==3){
			s.pop();
			digui();
		}
		if(now.x==m&&i==1){
			continue;
		}
		if(now.y==1&&i==2){
			continue;
		}
		if(now.y==n&&i==0){
			continue;
		}
		if(a[now.x+d[i][0]-1][now.y+d[i][1]-1]==0){    //递归和DFS搜索 
			a[now.x+d[i][0]-1][now.y+d[i][1]-1]=1;
			now.x+=d[i][0];
			now.y+=d[i][1];
			now.dir=i+1;
			s.push(now);
			if(now.x==endx&&now.y==endy){
				flag=1;
				return;
				}
			else digui();
			
		}
		else if(i==3&&a[now.x+d[i][0]][now.y+d[i][1]]==1){
			s.pop();
			digui();
			
		}			
	}
	
}

int main(){
	cin>>m>>n;
	cin>>startx>>starty>>endx>>endy;
	for(int i=0;i<m;i++){
		for(int j=0;j<n;j++){
			cin>>a[i][j];
		}
	}
	now.x=startx;
	now.y=starty;
	now.dir=0;
	s.push(now);
	digui();

	base e[10000];
	int sum=0;
	if(s.empty()){
		cout<<"no"<<endl;	//没有搜到到,输出no 
		return 0;
	} 
	while(!s.empty()){	//栈存储的是逆序路径,转化为顺序路径 
		
		e[sum]=s.top();
		
		sum++;
		s.pop(); 		
	}
	for(int i=sum-1;i>=0;i--){
		if(i!=0)
		cout<<"("<<e[i].x<<","<<e[i].y<<","<<e[i-1].dir<<")"<<",";
		else
		cout<<"("<<e[i].x<<","<<e[i].y<<","<<e[i].dir<<")";
	}
	return 0;
}

转载请标明出处:请附上链接