4024: Bloxorz

news/2024/11/17 10:57:11/

 

题目描述

 

大h喜欢玩游戏。有一天,他下载了一款名为“Bloxorz”的电脑游戏,令他兴奋不已。这是一个关于在地面上将盒子滚动到特定位置的游戏。确切地说,由许多1*1的地砖组成的平面矩形区域。盒子是一个底面为1*1,高为2的立方体,可以平放并占据两个相邻的地砖或竖放并占据一个地砖。人们可以通过在地面上挑选盒子的四个方向中的一个来移动盒子并且将盒子向该方向滚动90度,这被计为一次移动。有三种地砖,普通地砖,易碎地砖和空地砖。普通可以支撑盒子的全部重量,易碎地砖只能支撑盒子重量的一半,所以盒子不能竖放在它上面。空地砖不能承重,也就是盒子的任意部分不能在它上面。游戏的目标是以最少的移动次数将盒子竖放在上唯一的目标地砖上。

盒子竖放一个地砖上:

盒子水平放置在两个相邻的地砖上:

盒子垂直放置在两个相邻的地砖上:

大h在通过游戏的几个阶段后,他发现这游戏比他预期的要简单得多。所以他打算写一个游戏脚本来计算最少移动次数。

 

输入

 

 

输入包含多组数据。每组数据以两个整数R和C(3≤R,C≤500)开始,它代表地面面的行数和列数。接下来R行,每行C个字符,目标地砖为'O',盒子的初始位置为'X','.'表示普通地砖,'#'表示空地砖,“E”表示易碎地砖。数据以两个零结尾。

输入保证:

地面上只有一个'O'。

在地面上有一个'X'或相邻的两个'X'。

第一行(列)和最后一行(列)一定是“#”(空地砖)

 

 

输出

 

 

每组数据一行,若可以完成游戏,则输出最小移动次数,否则输出"Impossible"(不带引号)。

 

 

样例输入

<span style="color:#333333"><span style="color:#333333">7 7
#######
#..X###
#..##O#
#....E#
#....E#
#.....#
#######
0 0</span></span>

样例输出 

<span style="color:#333333"><span style="color:#333333">10</span></span>

题解:设计Dist[i][j][k]表示从起点出发到(i,j),k表示不同的方法。

如0,1,2,3表示横放的四个方向,4表示竖放。

然后跑一遍最短路即可 

#include<iostream>
#include<cstdio>
#include<algorithm>
#include<queue>
using namespace std;
struct Node
{int x,y,p,dis;//bool operator < (const Node &T) const {return dis>T.dis;}
};
queue<Node>que;
int n,m,sx,sy,sx1,sy1,Dist[505][505][6],zx,zy;char ch[505][505];
const int dx[4]={0,-1,0,1},dy[4]={1,0,-1,0};
bool pd(int x,int y)
{if(x>0&&x<=n&&y>0&&y<=m)return true;return false;
}
int main()
{while(1){scanf("%d%d",&n,&m);if(!n&&!m)break;for(int i=1;i<=n;++i)scanf(" %s",ch[i]+1);sx=sy=0;for(int i=1;i<=n;++i)for(int j=1;j<=m;++j){if(ch[i][j]=='X'){if(!sx)sx=i,sy=j;else sx1=i,sy1=j;}if(ch[i][j]=='O')zx=i,zy=j;}for(int i=1;i<=n;++i)for(int j=1;j<=m;++j)for(int k=0;k<5;++k)Dist[i][j][k]=1e9;if(!sx1){Dist[sx][sy][4]=0;que.push((Node){sx,sy,4,0});}else {int t;for(t=0;t<4;t++){if(sx+dx[t]==sx1&&sy+dy[t]==sy1)break;}Dist[sx][sy][t]=0;que.push((Node){sx,sy,t,0});}while(!que.empty()){Node t=que.front();que.pop();//cout<<"aaa "<<t.x<<' '<<t.y<<' '<<t.p<<' '<<t.dis<<endl;if(Dist[t.x][t.y][t.p]!=t.dis)continue;if(t.p==4){for(int i=0;i<4;++i){int nx1=t.x+dx[i],ny1=t.y+dy[i],nx2=nx1+dx[i],ny2=ny1+dy[i];if(!pd(nx1,ny1)||!pd(nx2,ny2))continue;if(ch[nx1][ny1]=='#'||ch[nx2][ny2]=='#')continue;if(Dist[nx1][ny1][i]>Dist[t.x][t.y][4]+1){Dist[nx1][ny1][i]=Dist[t.x][t.y][4]+1;//Dist[nx2][ny2][(i+2)%4]=Dist[t.x][t.y][4]+1;que.push((Node){nx1,ny1,i,Dist[nx1][ny1][i]});}}continue;}int nx1=t.x+dx[(t.p+2)%4],ny1=t.y+dy[(t.p+2)%4],nx2,ny2,sum;if(pd(nx1,ny1)){if(Dist[nx1][ny1][4]>t.dis+1&&ch[nx1][ny1]!='#'&&ch[nx1][ny1]!='E'){Dist[nx1][ny1][4]=t.dis+1;que.push((Node){nx1,ny1,4,t.dis+1});}}nx1=t.x+2*dx[t.p],ny1=t.y+2*dy[t.p];if(pd(nx1,ny1)){if(Dist[nx1][ny1][4]>t.dis+1&&ch[nx1][ny1]!='#'&&ch[nx1][ny1]!='E'){Dist[nx1][ny1][4]=t.dis+1;que.push((Node){nx1,ny1,4,t.dis+1});}}if(!t.p||t.p==2){nx1=nx2=t.x+1;ny1=t.y;ny2=ny1+dy[t.p];if(pd(nx1,ny1)&&pd(nx2,ny2)){   if(Dist[nx1][ny1][t.p]>t.dis+1&&ch[nx1][ny1]!='#'&&ch[nx2][ny2]!='#'){Dist[nx1][ny1][t.p]=t.dis+1;Dist[nx2][ny2][(t.p+2)%4]=t.dis+1;que.push((Node){nx1,ny1,t.p,t.dis+1});}}nx1=nx2=t.x-1;ny1=t.y;ny2=ny1+dy[t.p];if(pd(nx1,ny1)&&pd(nx2,ny2)){if(Dist[nx1][ny1][t.p]>t.dis+1&&ch[nx1][ny1]!='#'&&ch[nx2][ny2]!='#'){Dist[nx1][ny1][t.p]=t.dis+1;Dist[nx2][ny2][(t.p+2)%4]=t.dis+1;que.push((Node){nx1,ny1,t.p,t.dis+1});}}}if(t.p==1||t.p==3){ny1=ny2=t.y+1;nx1=t.x;nx2=t.x+dx[t.p];if(pd(nx1,ny1)&&pd(nx2,ny2)){if(Dist[nx1][ny1][t.p]>t.dis+1&&ch[nx1][ny1]!='#'&&ch[nx2][ny2]!='#'){Dist[nx1][ny1][t.p]=t.dis+1;Dist[nx2][ny2][(t.p+2)%4]=t.dis+1;que.push((Node){nx1,ny1,t.p,t.dis+1});}}ny1=ny2=t.y-1;nx1=t.x;nx2=t.x+dx[t.p];if(pd(nx1,ny1)&&pd(nx2,ny2)){if(Dist[nx1][ny1][t.p]>t.dis+1&&ch[nx1][ny1]!='#'&&ch[nx2][ny2]!='#'){Dist[nx1][ny1][t.p]=t.dis+1;Dist[nx2][ny2][(t.p+2)%4]=t.dis+1;que.push((Node){nx1,ny1,t.p,t.dis+1});}}}}if(Dist[zx][zy][4]==1e9)puts("Impossible");else printf("%d\n",Dist[zx][zy][4]);}
}

 


http://www.ppmy.cn/news/734854.html

相关文章

day0329

day0329 DOM 是一项 W3C (World Wide Web Consortium) 标准。 HTML DOM&#xff08;文档对象模型&#xff09; HTML DOM 是 HTML 的标准对象模型和编程接口。它定义了&#xff1a; - 作为对象的 HTML 元素 - 所有 HTML 元素的属性 - 访问所有 HTML 元素的方法 - 所有 HTM…

day0429

day0429 CSS3 渐进增强/优雅降级 区别&#xff1a; 优雅降级是从复杂的现状开始&#xff0c;并试图减少用户体验的供给&#xff0c;而渐进增强则是从一个非常基础的&#xff0c;能够起作用的版本开始&#xff0c;并不断扩充&#xff0c;以适应未来环境的需要。降级&#xff0…

Spring 集成与分片详解

1.Spring集成与分片详解 1.1pom依赖 1.2application.properties 定义配置类和任务类中要用到的参数 1.3创建任务 创建任务类&#xff0c;加上Component注解 1.4注册中心配置 Bean的initMethod属性用来指定Bean初始化完成之后要执行的方法&#xff0c;用来替代继承Initializ…

ejob集成

1.ejob集成 1.1添加Pom 1.2任务类型 任务类型有三种&#xff1a; SimpleJob SimpleJob:简单实现&#xff0c;未经任何封装的类型。需实现SimpleJob接口。 DataFlowJob DataFlowJob&#xff1a;Dataflow类型用于处理数据流&#xff0c;必须实现fetchData()和processData()的方…

080424

1. 使用printf() 函数显示下列菜单&#xff1a; Menu 1. Input the students’ names and scores 2. Search scores of some students3. Modify scores of some students4. List all students’ scores 5. Quit the system Please input your choise (1-…

20230608

helm 包管理器 目的/作用&#xff1a;提升下载第三方库或者软件的效率 管理chart chart&#xff1a;docker的镜像、软件的安装包&#xff0c;k8s资源 k8s应用程序所必需的一系列信息&#xff0c; 创建一个应用程序所需的deployment、service、job等封装到一个文件里管理 co…

BZOJ4011: [HNOI2015]落忆枫音

Orz PoPoQQQ&#xff1a;http://blog.csdn.net/popoqqq/article/details/45194103 用脉络树总数减去不合法的情况&#xff08;即树上有环的情况&#xff09;&#xff0c;拓扑序DP&#xff0c;注意特判连的边指向1的情况 学到了新姿势&#xff1a;线性求逆元 原理&#xff1a;…

P2394 yyy loves Chemistry I

P2394 yyy loves Chemistry I # yyy loves Chemistry I ## 题目背景 因为会吃回车,所以放到题目描述里了喵~ ## 题目描述 [故事背景] 从前,有个人叫yyy,他特别喜欢化学,尤其是一些很危(zuo)险(si)的实验. [题目背景] 这一天,他开始研究起了一个神奇又有趣的方程式 2Na…