POJ 1475 Pushing Boxes G++ bfs 巧妙 背

本文介绍了一种解决迷宫推箱子游戏问题的算法实现,通过定义两种搜索结构:一种针对玩家行动,另一种针对箱子移动,结合广度优先搜索策略,有效解决了游戏中的路径寻找难题。

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

#include <iostream>
#include <cstdio>
#include <cstring>
#include <queue>
using namespace std;
//英语      看博友分析    抄博友程序     POJac      百练ve       bfs    巧妙    背   
struct person{
	int x,y;
	string ans;
}P,Q;
struct status{ 
	int p_x,p_y;
	int b_x,b_y;
	string res;
}p,q;//抄博友程序 
int dx[4]={0,0,1,-1};
int dy[4]={1,-1,0,0};
char pd[6]="ewsn";
char bd[6]="EWSN";
char da[30][30];
int n,m;
int sx,sy,ex,ey,bx,by;
int p_vis[30][30];
int b_vis[30][30]; 
bool check(int x, int y)
{
	if(x>=0 && x<n && y>=0 && y<m && da[x][y]!='#')
	{
		return true;
	}else
	{
		return false;
	}
}
int p_bfs(int s_x,int s_y, int e_x,int e_y)
{
	//cout<<"p_bfs "<<s_x<<" "<<s_y<<" "<<e_x<<" "<<e_y<<endl;
	memset(p_vis,0,sizeof(p_vis));
	P.x=s_x;//抄博友程序 
	P.y=s_y;
	//cout<<P.x<<"-----"<<P.y<<endl;
	P.ans="";
	p_vis[s_x][s_y]=1;//人的位置 
	//cout<<"box "<<p.b_x<<" "<<p.b_y<<endl;
	p_vis[p.b_x][p.b_y]=1;//箱子的位置  全局变量 
	queue<person> que;
	que.push(P);
	while(que.empty()!=1)
	{
		P=que.front();//全局变量 
		que.pop();
		//cout<<"P "<<P.x<<" "<<P.y<<endl;
		if(P.x==e_x && P.y==e_y)//抄博友程序 
		{
			return 1;
		}
		
		for(int i=0;i<4;i++)
		{
			int x=dx[i]+P.x;
			int y=dy[i]+P.y;
			if(check(x,y)&& p_vis[x][y]==0)
			{
				//cout<<x<<" "<<y<<endl; 
				p_vis[x][y]=1;
				person t;
				t.x=x;
				t.y=y;
				t.ans=P.ans+pd[i];
				que.push(t);
			} 
		}
	}	
	return 0;
}
int b_bfs()
{
	memset(b_vis,0,sizeof(b_vis));
	queue<status> que;
	p.b_x=bx;//抄博友程序 
	p.b_y=by;
	p.p_x=sx;
	p.p_y=sy;
	p.res=""; 
	que.push(p);
	b_vis[bx][by]=1;
	while(que.empty()!=1)
	{
		p=que.front();
		que.pop();
		for(int i=0;i<4;i++)
		{
			int bbx=p.b_x+dx[i];//题意 
			int bby=p.b_y+dy[i];
			int ppx=p.b_x-dx[i];//巧妙 
			int ppy=p.b_y-dy[i];
			if(check(bbx,bby) && check(ppx,ppy) && b_vis[bbx][bby]==0)//背
			{
				if(p_bfs(p.p_x,p.p_y,ppx,ppy))//背 
				{
					b_vis[bbx][bby]=1;
					q.b_x=bbx;
					q.b_y=bby;
					q.p_x=p.b_x;//题意    背 
					q.p_y=p.b_y; 
					q.res=p.res+P.ans+bd[i];//背   全局变量 
					if(bbx==ex&& bby==ey)
					{
						return 1;
					}
					que.push(q); 
				}
			} 
		} 
	}
	return 0;//抄博友程序 
}
int main()
{
	int tag=0;
	while(1)
	{
		tag++;
		cin>>n>>m;
		memset(da,0,sizeof(da));
		if(n==0 && m==0)
		{
			break;
		}
		for(int i=0;i<n;i++)
		{
			for(int j=0;j<m;j++)
			{
				cin>>da[i][j];
				if(da[i][j]=='S')
				{
					sx=i,sy=j;
				}
				if(da[i][j]=='T')
				{
					ex=i,ey=j;
				}
				if(da[i][j]=='B')
				{
					bx=i;
					by=j;
				}
			}
		}
		/*
		for(int i=0;i<n;i++)
		{
			for(int j=0;j<m;j++)
			{
				cout<<da[i][j];
			}
			cout<<endl;
		}*/
		cout<<"Maze #"<<tag<<endl;
		if(b_bfs())
		{
			cout<<q.res<<endl;
		}else
		{
			cout<<"Impossible."<<endl;
		}
		cout<<endl;	
	}
	return 0;
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值