走迷宫

27 篇文章 0 订阅

走迷宫
这分明是一道广搜的模板题,但是我却搞了好久才搞懂。
最坑的地方:
1.起始点变不变为阻塞的,无影响
2.往四个方向搜索时,是满足条件再执行或者是不满足条件跳过,也无影响
3.进入深搜时的位置需要变为阻塞,所以起点最好也设定为阻塞。
4.不剪枝会超时,稍微剪一下就能过。

DFS + 回溯

#include<bits/stdc++.h> 
using namespace std;
char arr[12][12];
int dx[4]={1,-1,0,0};
int dy[4]={0,0,1,-1};
//DFS+回溯 
int Min_step;
int M=10,N=10;
void dfs(int x, int y,int steps){
	if((steps + abs(9-x) + abs(8-y)) >= Min_step) return; //剪枝 
	if(x==9&&y==8) {  //终点 
		if(Min_step > steps) Min_step=steps;
		return;		
	}
	for(int i=0;i<4;i++){ //四个方向 
		int xx = x + dx[i];
		int yy = y + dy[i];
		if(xx>=0&&xx<M&&yy>=0&&yy<N&&arr[xx][yy]=='.'){ //要用限制条件 
			arr[xx][yy]='#'; 
			dfs(xx,yy,steps+1);
			arr[xx][yy]='.';	
		} 
	}
}
int main(){
		while(~scanf("%s",arr[0])){
		for(int i=1;i<10;i++){
			scanf("%s",arr[i]);
		}
		Min_step=101;
		arr[0][1]='#'; 
		dfs(0,1,0);
		printf("%d\n",Min_step);
	}
	return 0;
}

BFS

#include<bits/stdc++.h> 
using namespace std;
char arr[25][25];
int dx[4]={1,-1,0,0};
int dy[4]={0,0,1,-1};
//终于可以通过了!!! 
struct point{
	int x,y,step;
};
int bfs(){
	queue<point> q;
	point s;
	s.x=0, s.y=1, s.step=0;
	q.push(s);
	arr[s.x][s.y]='#';
	while(!q.empty()){
		point e = q.front();
		q.pop();
		if(e.x==9&&e.y==8) return e.step;
		for(int i=0;i<4;i++){
			s.x = e.x + dx[i];
			s.y = e.y + dy[i];
			if(s.x>=0&&s.x<10&&s.y>=0&&s.y<10&&arr[s.x][s.y]!='#'){
				s.step = e.step + 1;
				arr[s.x][s.y]='#';
				q.push(s);
			}	
		}
	}
	return -1;  //不加这个牛客网会出错
}
int main(){
	while(~scanf("%s",arr[0])){
		for(int i=1;i<10;i++){
			scanf("%s",arr[i]);
		}
		printf("%d\n",bfs());
	}
	return 0;
}

DFS+回溯

#include<bits/stdc++.h> 
using namespace std;
char arr[12][12];
int dx[4]={1,-1,0,0};
int dy[4]={0,0,1,-1};
//DFS+回溯 超时 
int Min_step;
int M=10,N=10;
void dfs(int x, int y,int steps){
	if(steps >= Min_step) return; //稍微剪一下
	if(x==9&&y==8) {  
		if(Min_step > steps) Min_step=steps;
		return;		
	}
	for(int i=0;i<4;i++){ 
		int xx = x + dx[i];
		int yy = y + dy[i];
		if(xx<0||xx>=M||yy<0||yy>=N||arr[xx][yy]=='#') continue; //唯一不同的地方
		arr[xx][yy]='#'; 
		dfs(xx,yy,steps+1);
		arr[xx][yy]='.';	
		
	}
}
int main(){
		while(~scanf("%s",arr[0])){
		for(int i=1;i<10;i++){
			scanf("%s",arr[i]);
		}
		Min_step=101;
		arr[0][1]='#'; 
		dfs(0,1,0);
		printf("%d\n",Min_step);
	}
	return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值