P3855 [TJOI2008] Binary Land(BFS)(内附封面)

news2024/7/4 5:54:07

[TJOI2008] Binary Land

题目背景

Binary Land是一款任天堂红白机上的经典游戏,讲述的是两只相爱的企鹅Gurin和Malon的故事。两只企鹅在一个封闭的迷宫中,你可以控制他们向上下左右四个方向移动。但是他们的移动有一个奇怪的规则,即如果你按“上”或“下”方向键,两只企鹅会同时向上移动或向下移动1格;如果你按“左”方向键,则Malon向左移动1格,同时Gurin向右移动1格;如果你按“右”方向键,则Malon向右移动1格,Gurin向左移动1格。当然,如果某只企鹅被障碍挡住,它就不会移动了。另外,在迷宫的某些格子处有蜘蛛网,如果任何一只企鹅进入这种格子,则游戏失败。两只企鹅不会相互阻挡,即在相向运动时他们可以“穿过”彼此,也可以同时处于同一格子里。迷宫的某个格子上有一颗红心,游戏的任务就是使两只企鹅同时到达这个格子。

题目描述

请编写程序找出完成任务所需的最少的操作步数。如果无法完成目标,输出“no”。

输入格式

第一行包含两个整数R, C 表示迷宫的长和宽。

按下来有R行,每行包含C个字符,描述了一个迷宫。其中’#’表示企鹅不能通过的障碍物,’X’表示蜘蛛网,’.’表示空地,’G’表示Gurin的初始位置,’M’表示Malon的初始位置,’T’表示终点位置。

输入数据保证标有’G’,’M’,’T’的格子分别只有一个,保证企鹅不可能走到迷宫以外。

输出格式

输出只有一行,为最少的操作步数。如果不能完成任务,输出“no”。

样例 #1

样例输入 #1

4 7
#######
#..T..#
#G##M##
#######

样例输出 #1

4

提示

满足要求的一个操作序列为:上-右-左-左

3 ≤ R, C ≤ 30

大致思路

!BFS!

根据题目,我们需要兼顾两个点,G与M,其实这与只看一个点时相差无几,用结构体存储即可,对于特殊的移动法则,我们也可以用一个数组存储方位来实现。BFS的判重可以直接用一个四维数组,反正数据范围不大

char sm[66][66];
int n,m;
int agx[]={0,-1,0,1};
int agy[]={-1,0,1,0};
int amx[]={0,-1,0,1};
int amy[]={1,0,-1,0};
struct awsl{
	int gx,gy,mx,my,cnt;
};
bool vis[31][31][31][31];
int goalx,goaly;
queue<awsl> q;
bool flag=1;

BFS部分直接套模板就好啦,对于G与M都处于’ # '的点,我们无需让他入队,不移动肯定不会是答案,也不会是最优。若搜索结束还没有搜到,则输出“ no ”
(代码较为繁琐,其实原理是很简单的QAQ)

while(!q.empty()){
		awsl tmp,kk;
		tmp=q.front();
		q.pop();
		if(vis[tmp.gx][tmp.gy][tmp.mx][tmp.my]==1)continue;
		vis[tmp.gx][tmp.gy][tmp.mx][tmp.my]=1;
		if(tmp.gx==tmp.mx&&tmp.gx==goalx&&tmp.gy==tmp.my&&tmp.my==goaly){
			cout<<tmp.cnt;
			flag=0;
			break;
		}
		for(int i=0;i<4;i++){
			int new_gx,new_gy,new_mx,new_my;
			new_gx=tmp.gx+agx[i];new_mx=tmp.mx+amx[i];
			new_gy=tmp.gy+agy[i];new_my=tmp.my+amy[i];
			if(sm[new_gx][new_gy]=='X'||sm[new_mx][new_my]=='X'){
				continue;
			}
			if(sm[new_gx][new_gy]=='#'&&sm[new_mx][new_my]!='#'){
				kk.cnt=tmp.cnt+1,kk.gx=tmp.gx,kk.gy=tmp.gy;
				kk.mx=new_mx,kk.my=new_my;
				q.push(kk);
			}
			else if(sm[new_gx][new_gy]!='#'&&sm[new_mx][new_my]=='#'){
				kk.cnt=tmp.cnt+1,kk.mx=tmp.mx,kk.my=tmp.my;
				kk.gx=new_gx,kk.gy=new_gy;
				q.push(kk);
			}
			else if(sm[new_gx][new_gy]!='#'&&sm[new_mx][new_my]!='#'){
				kk.cnt=tmp.cnt+1,kk.mx=new_mx,kk.my=new_my;
				kk.gx=new_gx,kk.gy=new_gy;
				q.push(kk);
			}
		}
	}
	if(flag)cout<<"no";

AC CODE

#include<bits/stdc++.h>
using namespace std;
char sm[66][66];
int n,m;
int agx[]={0,-1,0,1};
int agy[]={-1,0,1,0};
int amx[]={0,-1,0,1};
int amy[]={1,0,-1,0};
struct awsl{
	int gx,gy,mx,my,cnt;
};
bool vis[31][31][31][31];
int goalx,goaly;
queue<awsl> q;
bool flag=1;
int main(){
	cin>>n>>m;
	awsl k;
	for(int i=1;i<=n;i++){
		for(int j=1;j<=m;j++){
			cin>>sm[i][j];
			if(sm[i][j]=='G'){
				k.gx=i;
				k.gy=j;
			}
			if(sm[i][j]=='M'){
				k.mx=i;
				k.my=j;
			}
			if(sm[i][j]=='T'){
				goalx=i;
				goaly=j;
			}
		}
	}
	k.cnt=0;
	q.push(k);
	while(!q.empty()){
		awsl tmp,kk;
		tmp=q.front();
		q.pop();
		if(vis[tmp.gx][tmp.gy][tmp.mx][tmp.my]==1)continue;
		vis[tmp.gx][tmp.gy][tmp.mx][tmp.my]=1;
		if(tmp.gx==tmp.mx&&tmp.gx==goalx&&tmp.gy==tmp.my&&tmp.my==goaly){
			cout<<tmp.cnt;
			flag=0;
			break;
		}
		for(int i=0;i<4;i++){
			int new_gx,new_gy,new_mx,new_my;
			new_gx=tmp.gx+agx[i];new_mx=tmp.mx+amx[i];
			new_gy=tmp.gy+agy[i];new_my=tmp.my+amy[i];
			if(sm[new_gx][new_gy]=='X'||sm[new_mx][new_my]=='X'){
				continue;
			}
			if(sm[new_gx][new_gy]=='#'&&sm[new_mx][new_my]!='#'){
				kk.cnt=tmp.cnt+1,kk.gx=tmp.gx,kk.gy=tmp.gy;
				kk.mx=new_mx,kk.my=new_my;
				q.push(kk);
			}
			else if(sm[new_gx][new_gy]!='#'&&sm[new_mx][new_my]=='#'){
				kk.cnt=tmp.cnt+1,kk.mx=tmp.mx,kk.my=tmp.my;
				kk.gx=new_gx,kk.gy=new_gy;
				q.push(kk);
			}
			else if(sm[new_gx][new_gy]!='#'&&sm[new_mx][new_my]!='#'){
				kk.cnt=tmp.cnt+1,kk.mx=new_mx,kk.my=new_my;
				kk.gx=new_gx,kk.gy=new_gy;
				q.push(kk);
			}
		}
	}
	if(flag)cout<<"no";
	return 0;
}

附封面(四叶漫画和剧场版赢得好啊 ,虽说番的结局还没定

请添加图片描述

赠下图请添加图片描述

请添加图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/822452.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

cloudstack之basic network

本章则主要尝试basic network模式的使用。 基础环境搭建见cloudstack测试环境搭建 1、概念介绍 cloudstack的网络模式主要分为两种&#xff1a; basic network&#xff1a;一个zone中仅有一个guest network来承载客户虚拟机的流量&#xff0c;可以理解为一个简单的二层网络。…

【EI/SCOPUS征稿】2023年算法、图像处理与机器视觉国际学术会议(AIPMV2023)

2023年算法、图像处理与机器视觉国际学术会议&#xff08;AIPMV2023&#xff09; 2023 International Conference on Algorithm, Image Processing and Machine Vision&#xff08;AIPMV2023&#xff09; 2023年算法、图像处理与机器视觉国际学术会议&#xff08;AIPMV2023&am…

Django学习记录:使用ORM操作MySQL数据库并完成数据的增删改查

Django学习记录&#xff1a;使用ORM操作MySQL数据库并完成数据的增删改查 数据库操作 MySQL数据库pymysql Django开发操作数据库更简单&#xff0c;内部提供了ORM框架。 安装第三方模块 pip install mysqlclientORM可以做的事&#xff1a; 1、创建、修改、删除数据库中的…

maven如何打包你会吗?

1.新建一个maven项目&#xff0c;在main/java中建立Main类 public class Main {public static void main(String[] args) {System.out.println("hello java ...");} } 2.添加依赖&#xff0c;使其成为可执行包 <build><plugins><!--打包成为可执行包-…

uniapp app端 echarts 设置tooltip的formatter不生效问题以及解决办法

需求一&#xff1a; y轴数据处理不同数据增加不同单位 需求二&#xff1a; 自定义图表悬浮显示的内容 需求一&#xff1a;实现方式 在yAxis里面添加formatter yAxis: [{//y轴显示value的设置axisLabel: {show: true,formatter (value, index) > {var valueif (value > 1…

Uboot实现PSCI

快速链接: . &#x1f449;&#x1f449;&#x1f449; 【目录】ARM/TEE/ATF/SOC微信群问题记录 &#x1f448;&#x1f448;&#x1f448; 付费专栏-付费课程 【购买须知】: 问 &#xff1a; 8核的A72 多核启动 目前用的spin-table的方式&#xff0c;想尝试一下psci方式&…

Redis事务、管道

一.Redis事务 1.概念 可以一次执行多个命令&#xff0c;本质是一组命令的集合。一个事务中的所有命令都会序列化&#xff0c;按顺序地串行化执行而不会被其它命令插入&#xff0c;不许加塞 2.Redis事务与数据库事物的区别 3.常用命令 4.事务执行情况 正常执行 即整个过程…

全国高校招投标信息在哪里看?

很多投标人在查询招标信息的时候常常没有找到合适的&#xff0c;但是现在网上查询投标信息的网站是很多的。而学校招标信息获取的渠道是比较少的&#xff0c;企业的反而更多一些&#xff0c;那么我们能在那些渠道获取这些信息&#xff1f; 1.教育部网站 教育部提供了招标信息…

LeetCode 周赛上分之旅 # 36 KMP 字符串匹配殊途同归

⭐️ 本文已收录到 AndroidFamily&#xff0c;技术和职场问题&#xff0c;请关注公众号 [彭旭锐] 和 BaguTree Pro 知识星球提问。 学习数据结构与算法的关键在于掌握问题背后的算法思维框架&#xff0c;你的思考越抽象&#xff0c;它能覆盖的问题域就越广&#xff0c;理解难度…

Java精通 —— 一篇文章弄懂锁

前言 在Java中为了保证操作线程的安全性&#xff0c;我们引入了锁的概念&#xff0c;但随之而来的性能问题让我们在不愿意放弃安全性保证的前提下提出了优化过的锁。在这篇文章中&#xff0c;荔枝会着重梳理不同的锁的概念和普通锁的执行机制相关知识&#xff0c;同时也会对Jav…

【CAS6.6源码解析】深度解析票据淘汰与过期策略-探究数据淘汰策略的设计

票据作为一种时效很敏感的数据&#xff0c;其过期策略的设计对其功能性和性能影响很大。本文将深度解析票据淘汰与过期策略&#xff0c;并基于此探究数据淘汰策略的设计&#xff0c;让我们一起走进企业级中央认证中心CAS的源码&#xff0c;分析其设计的巧妙之处。 文章重点分析…

二十三种设计模式第二十二篇--中介者模式

说到这个模式就有趣了&#xff0c;不知道大家在生活中喷到过中介没&#xff1f;其实中介这个词吧&#xff0c;我也说不上好还是坏&#xff0c;有时候他可以帮助人们更快的达到某个目的&#xff0c;但有的时候吧&#xff0c;这个有贼坑人&#xff0c;相信网络上有各种被中介坑的…

Redis场景应用:详细实现网站粉丝关注与展示的功能

&#x1f3c6;作者简介&#xff0c;黑夜开发者&#xff0c;全栈领域新星创作者✌&#xff0c;阿里云社区专家博主&#xff0c;2023年6月csdn上海赛道top4。多年电商行业从业经验&#xff0c;对系统架构&#xff0c;数据分析处理等大规模应用场景有丰富经验。 &#x1f3c6;本文…

嵌入式Linux下 i2c-tool工具的使用方法 包括i2cdetect、i2cget、i2cset、i2cdump、i2ctransfer

要想用Linux i2c-tools必须安装如下套件&#xff0c;安装后就可以使用i2cdetect、i2cdump、i2cset、i2cget、i2ctransfer了。 sudo apt install i2c-tools -yi2cdetect命令 该命令用于扫描I2C总线上的设备。 语法&#xff1a;i2cdetect [-y] [-a] [-q|-r] i2cbus [first las…

[论文笔记] chatgpt系列 2.6 DeepSpeed-chat 数据集

一、FT数据集 & Reward model数据集 Deepspeed-chat 源代码的数据集: Dahoas/rm-static: 这是一个用于强化学习的静态环境数据集,包含了一个机器人在一个固定环境中的运动轨迹。该数据集旨在用于评估强化学习算法在静态环境下的表现。 Dahoas/full-hh-rlhf: 这是一个用于…

二十三种设计模式第二十四篇--访问者模式(完结撒花)

在访问者模式&#xff08;Visitor Pattern&#xff09;中&#xff0c;我们使用了一个访问者类&#xff0c;它改变了元素类的执行算法。 通过这种方式&#xff0c;元素的执行算法可以随着访问者改变而改变。 这种类型的设计模式属于行为型模式。根据模式&#xff0c;元素对象已接…

openGauss学习笔记-27 openGauss 高级数据管理- JOIN

文章目录 openGauss学习笔记-27 openGauss 高级数据管理- JOIN27.1 交叉连接27.2 内连接27.3 左外连接27.4 右外连接27.5 全外连接 openGauss学习笔记-27 openGauss 高级数据管理- JOIN JOIN子句用于把来自两个或多个表的行结合起来&#xff0c;基于这些表之间的共同字段。 在…

SLA探活工具EaseProbe

工具介绍 EaseProbe可以做三种工作&#xff1a;探测、通知和报告。 项目地址&#xff1a;https://github.com/megaease/easeprobe 1、安装 [rootlocalhost ]# yum -y install unzip go [rootlocalhost ]# unzip easeprobe-main.zip [rootlocalhost ]# cd easeprobe-main [r…

如祺出行冲刺自动驾驶商业化,人少的地方机会多?

网约车&#xff0c;正在迎来让人“不明觉厉”的新一轮竞赛。 网约车监管信息交互系统的数据显示&#xff0c;截至今年6月30日&#xff0c;全国共有318家网约车平台公司取得网约车平台经营许可&#xff0c;环比增加5家&#xff1b;网约车监管信息交互系统6月份共收到订单信息7.…

作为新手小白,你应该了解的五个3DMAX的使用干货小技巧!

3Dmax是一款著名的三维建模和动画制作软件&#xff0c;广泛应用于建筑设计、影视特效、游戏开发等领域。对于初学者来说&#xff0c;熟练掌握一些干货小技巧&#xff0c;可以帮助大家更快地上手和使用这款强大的软件。 一、学习基础操作技巧 首先&#xff0c;你需要学习一些基…