Penguins

Posted Jozky86

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Penguins相关的知识,希望对你有一定的参考价值。

Penguins

题意:

有两个20*20的地图,有障碍物,两个地图各有一个小人,左侧地图的小人要从右下角走到右上角,右侧地图的小人要从左下角走到左上角,这两个小人是镜像移动的,

左侧小人右侧小人
左移动右移动
右移动左移动
上移动上移动

现在问最短路径是多少,且输出移动情况,并要求移动的字典序最小
(D<L<R<U)

题解:

BFS模拟,两个人同步移动
没啥说的,就是纯BFS模拟过程,详细看代码

代码 :

#include<bits/stdc++.h>
using namespace std;
const int maxn=20+10;
//string mp1[maxn];
//string mp2[maxn];
char mp[2][maxn][maxn];
char mp1[maxn][maxn];
char mp2[maxn][maxn];
int vis[maxn][maxn][maxn][maxn];
int turn[4][2]={0,-1,0,1,-1,0,1,0};
int turn2[4][2]={0,1,0,-1,-1,0,1,0};
struct node{
	int x1,y1,x2,y2;
	string s;
}; 
char ss[15]="LRUD";
bool check(int x1,int y1,int id)
{
	if(x1>20||y1>20||x1<=0||y1<=0)return 0;
	if(mp[id-1][x1][y1]=='#')
	{
		return 0;
	}
	
	return 1;
	
	
}
node ans;
int len=0;
int bfs()
{
	queue<node >q;
	node t1;
	t1={20,20,20,1,""};
	q.push(t1);
	while(!q.empty())
	{
		node now=q.front();
		q.pop();
		if(vis[now.x1][now.y1][now.x2][now.y2]==1)continue;
		vis[now.x1][now.y1][now.x2][now.y2]=1;

		if(now.x1==1&&now.y1==20&&now.x2==1&&now.y2==1)
		{
			ans=now;
			return now.s.size();
		}
		for(int i=0;i<4;i++)
		{
			int nx1,ny1,nx2,ny2;
			nx1=now.x1+turn[i][0];
			ny1=now.y1+turn[i][1];
			nx2=now.x2+turn2[i][0];
			ny2=now.y2+turn2[i][1];
			if(check(nx1,ny1,1)==0&&check(nx2,ny2,2)==0)//左右都不能走 
			{
				continue;
			}
			if(check(nx1,ny1,1)==1&&check(nx2,ny2,2)==0)//左边能走,右边不能走 
			{
				t1={nx1,ny1,now.x2,now.y2,now.s+ss[i]};
				q.push(t1);
			}
			if(check(nx1,ny1,1)==0&&check(nx2,ny2,2)==1)//右边能走 
			{
				t1={now.x1,now.y1,nx2,ny2,now.s+ss[i]};
				q.push(t1);
			}
			if(check(nx1,ny1,1)==1&&check(nx2,ny2,2)==1)
			{
				t1={nx1,ny1,nx2,ny2,now.s+ss[i]};
				q.push(t1);
			}
		}
	}
	
}
void pr()
{
	mp[0][20][20]='A';
	mp[1][20][1]='A';
	int nx1,ny1,nx2,ny2;
	nx1=20,ny1=20,nx2=20,ny2=1;
	for(int i=1;i<=len;i++)
	{
		if(ans.s[i-1]=='L')
		{
			if(check(nx1+turn[0][0],ny1+turn[0][1],1))//左侧可以走 
			{
				nx1=nx1+turn[0][0];
				ny1=ny1+turn[0][1];
			}
			if(check(nx2+turn2[0][0],ny2+turn2[0][1],2))//右侧可以走 
			{
				nx2=nx2+turn2[0][0];
				ny2=ny2+turn2[0][1];
			}
		}
		else if(ans.s[i-1]=='R')
		{
			if(check(nx1+turn[1][0],ny1+turn[1][1],1))
			{
				nx1=nx1+turn[1][0];
				ny1=ny1+turn[1][1];
			}
			if(check(nx2+turn2[1][0],ny2+turn2[1][1],2))
			{
				nx2=nx2+turn2[1][0];
				ny2=ny2+turn2[1][1];
			}
		}
		else if(ans.s[i-1]=='U')
		{
			if(check(nx1+turn[2][0],ny1+turn[2][1],1))
			{
				nx1=nx1+turn[2][0];
				ny1=ny1+turn[2][1];
			}
			if(check(nx2+turn2[2][0],ny2+turn2[2][1],2))
			{
				nx2=nx2+turn2[2][0];
				ny2=ny2+turn2[2][1];
			}
		 } 
		else
		{
			if(check(nx1+turn[3][0],ny1+turn[3][1],1))
			{
				nx1=nx1+turn[3][0];
				ny1=ny1+turn[3][1];
			}
			if(check(nx2+turn2[3][0],ny2+turn2[3][1],2))
			{
				nx2=nx2+turn2[3][0];
				ny2=ny2+turn2[3][1];
			}
		}
		mp[0][nx1][ny1]='A';
		mp[1][nx2][ny2]='A';
	}
}
int main()
{
	for(int i=1;i<=20;i++)
	{
		scanf("%s %s",mp[0][i]+1, mp[1][i]+1);
	}
	//mp[0]表示左侧图,mp[1]表示右侧图 
	len=bfs();
	cout<<len<<endl;
	cout<<ans.s<<endl;
	pr();//标记移动路径 
	for(int i=1;i<=20;i++)
	{
		for(int j=1;j<=20;j++)
		{
			cout<<mp[0][i][j];
		}
		cout<<" ";
		for(int j=1;j<=20;j++)
		{
			cout<<mp[1][i][j];
		}
		cout<<endl;
	} 
	return 0;
}

以上是关于Penguins的主要内容,如果未能解决你的问题,请参考以下文章

seaborn笔记:绘制点的分布

2021牛客暑期多校训练营2.I Penguins BFS广搜 简单

清澄 A1485. Catch The Penguins 抓企鹅

从Punks Apes到Penguins:头像型NFT如何成为新文化范式 |链捕手

如何更改 seaborn pairplot 中仅 x 或 y 标签的字体大小?

微信小程序代码片段