POJ 3083 Children of the Candy Corn

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

模拟+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;
}

## 软件功能详细介绍 1. **文本片段管理**:可以添加、编辑、删除常用文本片段,方便快速调用 2. **分组管理**:支持创建多个分组,不同类型的文本片段可以分类存储 3. **热键绑定**:为每个文本片段绑定自定义热键,实现一键粘贴 4. **窗口置顶**:支持窗口置顶功能,方便在其他应用程序上直接使用 5. **自动隐藏**:可以设置自动隐藏,减少桌面占用空间 6. **数据持久化**:所有配置和文本片段会自动保存,下次启动时自动加载 ## 软件使用技巧说明 1. **快速添加文本**:在文本输入框中输入内容后,点击"添加内容"按钮即可快速添加 2. **批量管理**:可以同时编辑多个文本片段,提高管理效率 3. **热键冲突处理**:如果设置的热键与系统或其他软件冲突,会自动提示 4. **分组切换**:使用分组按钮可以快速切换不同类别的文本片段 5. **文本格式化**:支持在文本片段中使用换行符和制表符等格式 ## 软件操作方法指南 1. **启动软件**:双击"大飞哥软件自习室——快捷粘贴工具.exe"文件即可启动 2. **添加文本片段**: - 在主界面的文本输入框中输入要保存的内容 - 点击"添加内容"按钮 - 在弹出的对话框中设置热键和分组 - 点击"确定"保存 3. **使用热键粘贴**: - 确保软件处于运行状态 - 在需要粘贴的位置按下设置的热键 - 文本片段会自动粘贴到当前位置 4. **编辑文本片段**: - 选中要编辑的文本片段 - 点击"编辑"按钮 - 修改内容或热键设置 - 点击"确定"保存修改 5. **删除文本片段**: - 选中要删除的文本片段 - 点击"删除"按钮 - 在确认对话框中点击"确定"即可删除
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值