POJ 3083 Children of the Candy Corn

本文深入探讨了BFS算法在路径搜索中的应用,包括如何通过turnleft和turnright函数实现左转和右转优先搜索策略。文章还介绍了如何通过优化left和right函数提高代码效率,以及BFS算法的基本实现过程。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

模拟+BFS ,应该没什么难度吧,注意向左或向右转的时候优先搜索路径的顺序就可以了。编写两个函数turnleft和turnright, 通过对当前朝向的判断来控制路径就能轻松AC了。另外这道题的代码写长了,left和right函数应该可以写的更好一点,不过效率应该和现在差不多。

#include<iostream>
#include<cstdio>
#include<queue>
#include<cstring>
#define MAXN 40
using namespace std;
char map[MAXN+10][MAXN+10];
bool vis[MAXN+10][MAXN+10];
int dx[]={-1,0,1,0};
int dy[]={0,1,0,-1};
struct state{
	int x,y;
	int front;
};
state turnleft(state t)
{
	t.front=(t.front-1+4)%4;
	return t;
}
state turnright(state t)
{
	t.front=(t.front+1)%4;
	return t;
}

int left(state s,int step){
	int ans;
	if(map[s.x][s.y]=='E'){
		ans=step;
		return ans;
	}
	//printf("cur:[%d][%d],step=%d\n",s.x,s.y,step);
	s=turnleft(s);
	int tx=dx[s.front]+s.x;
	int ty=dy[s.front]+s.y;
	if(map[tx][ty]!='#'){
		s.x=tx;
		s.y=ty;
		ans=left(s,step+1);
	}else{
		s=turnright(s);
		int tx=dx[s.front]+s.x;
		int ty=dy[s.front]+s.y;
		if(map[tx][ty]!='#'){
			s.x=tx;
			s.y=ty;
			ans=left(s,step+1);
		}else{
			s=turnright(s);
			int tx=dx[s.front]+s.x;
			int ty=dy[s.front]+s.y;
			if(map[tx][ty]!='#'){
				s.x=tx;
				s.y=ty;
				ans=left(s,step+1);
			}else{
				s=turnright(s);
				int tx=dx[s.front]+s.x;
				int ty=dy[s.front]+s.y;
				if(map[tx][ty]!='#'){
					s.x=tx;
					s.y=ty;
					ans=left(s,step+1);
				}
			}
		}
	}
	return ans;
}
int right(state s,int step){
	int ans;
	if(map[s.x][s.y]=='E'){
		ans=step;
		return ans;
	}
	//printf("cur:[%d][%d],step=%d\n",s.x,s.y,step);
	s=turnright(s);
	int tx=dx[s.front]+s.x;
	int ty=dy[s.front]+s.y;
	if(map[tx][ty]!='#'){
		s.x=tx;
		s.y=ty;
		ans=right(s,step+1);
	}else{
		s=turnleft(s);
		int tx=dx[s.front]+s.x;
		int ty=dy[s.front]+s.y;
		if(map[tx][ty]!='#'){
			s.x=tx;
			s.y=ty;
			ans=right(s,step+1);
		}else{
			s=turnleft(s);
			int tx=dx[s.front]+s.x;
			int ty=dy[s.front]+s.y;
			if(map[tx][ty]!='#'){
				s.x=tx;
				s.y=ty;
				ans=right(s,step+1);
			}else{
				s=turnleft(s);
				int tx=dx[s.front]+s.x;
				int ty=dy[s.front]+s.y;
				if(map[tx][ty]!='#'){
					s.x=tx;
					s.y=ty;
					ans=right(s,step+1);
				}
			}
		}
	}
	return ans;
}
int bfs(int x,int y)
{
	int ans;
	queue<state>q;
	state tt={x,y,1};
	vis[x][y]=true;
	q.push(tt);
	while(!q.empty()){
		int cx=q.front().x;
		int cy=q.front().y;
		int cs=q.front().front;
		if(map[cx][cy]=='E'){
			ans=cs;
			break;
		}
		q.pop();
		for(int i=0;i<4;i++){
			int tx=cx+dx[i];
			int ty=cy+dy[i];
			if(map[tx][ty]!='#'&&!vis[tx][ty]){
				vis[tx][ty]=true;
				tt.x=tx;
				tt.y=ty;
				tt.front=cs+1;
				q.push(tt);
			}
		}
	}
	return ans;
}
int main()
{
	int n,w,h;
	int bx,by;
	cin >> n;
	while(n--){
		cin >> w >> h;
		memset(map,'#',sizeof(map));
		memset(vis,false,sizeof(vis));
		getchar();
		for(int i=1;i<=h;i++){
			for(int j=1;j<=w;j++){
				scanf("%c",&map[i][j]);
				if(map[i][j]=='S'){
					bx=i;
					by=j;
				}
			}
			getchar();
		}
		state l={bx,by,1};
		printf("%d %d %d\n",left(l,1),right(l,1),bfs(bx,by));
	}
	return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值