寒假训练——搜索 E - Bloxorz I
Little Tom loves playing games. One day he downloads a little computer game called 'Bloxorz' which makes him excited. It's a game about rolling a box to a specific position on a special plane. Precisely, the plane, which is composed of several unit cells, is a rectangle shaped area. And the box, consisting of two perfectly aligned unit cube, may either lies down and occupies two neighbouring cells or stands up and occupies one single cell. One may move the box by picking one of the four edges of the box on the ground and rolling the box 90 degrees around that edge, which is counted as one move. There are three kinds of cells, rigid cells, easily broken cells and empty cells. A rigid cell can support full weight of the box, so it can be either one of the two cells that the box lies on or the cell that the box fully stands on. A easily broken cells can only support half the weight of the box, so it cannot be the only cell that the box stands on. An empty cell cannot support anything, so there cannot be any part of the box on that cell. The target of the game is to roll the box standing onto the only target cell on the plane with minimum moves.
The box stands on a single cell
The box lies on two neighbouring cells, horizontally
The box lies on two neighbouring cells, vertically
After Little Tom passes several stages of the game, he finds it much harder than he expected. So he turns to your help.
Input
Input contains multiple test cases. Each test case is one single stage of the game. It starts with two integers R and C(3 ≤ R, C ≤ 500) which stands for number of rows and columns of the plane. That follows the plane, which contains R lines and C characters for each line, with 'O' (Oh) for target cell, 'X' for initial position of the box, '.' for a rigid cell, '#' for a empty cell and 'E' for a easily broken cell. A test cases starts with two zeros ends the input.
It guarantees that
- There's only one 'O' in a plane.
- There's either one 'X' or neighbouring two 'X's in a plane.
- The first(and last) row(and column) must be '#'(empty cell).
- Cells covered by 'O' and 'X' are all rigid cells.
Output
For each test cases output one line with the minimum number of moves or "Impossible" (without quote) when there's no way to achieve the target cell.
Sample Input
7 7
#######
#..X###
#..##O#
#....E#
#....E#
#.....#
#######
0 0
Sample Output
10 题目:Bloxorz I
大意:(非博主翻译)
有两个相邻的X,理解为横躺。
思路:
就是一个bfs,不过不太一样,可以这么理解一下,如果X是正方体和平常迷宫问题有区别吗?这个题目只是X是长方体,
所以在id不同的位置,上下左右移动也不同。
X,若只有一个说明是竖放,两个则说明是延x轴或者y轴放。
X会上下左右移动,这时候就麻烦一点了,因为以前的vis数组是一个二维的直接存放位置即可,但是这个时候若是横放,则会占据
两个位置,不过不用急,很简单就可以想到的,用三维数组,以左上角为标准,和id一起构成判断标准,这样就不会重判了。
具体代码:
在main函数里面,先读取这个图像,然后根据X判断出横躺还是竖放,其次读取O的位置,这个为目标位置
在bfs函数里面,先将这个X的位置存放进去,然后进去搜索。
有一个check函数,就是把这个搜索之后的数读进去,判断,有没有到禁格里,有没有超出去,简单来说,就是是否合法。
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <queue>
#include <iostream>
#include <algorithm>
using namespace std;
int n,m;
bool vis[5][505][505];
char a[505][505];
struct node
{
int id;
int r1,c1,r2,c2;
int step;
node(int id,int r1,int c1,int r2,int c2,int step):id(id),r1(r1),c1(c1),r2(r2),c2(c2),step(step){}
};
node ed=node(0,0,0,0,0,0),exa=node(0,0,0,0,0,0);
int to[3][4][4]={
{{-2,0,-1,0},{1,0,2,0},{0,1,0,2},{0,-2,0,-1}},
{{-1,0,-1,0},{1,0,1,0},{0,2,0,1},{0,-1,0,-2}},
{{-1,0,-2,0},{2,0,1,0},{0,1,0,1},{0,-1,0,-1}}
};
queue<node>que;
int cmp(int &x1,int &y1,int &x2,int &y2)//确定是竖放还是横躺
{
if(x1==x2&&y1==y2) return 1;
else if(x1==x2)
{
if(y1>y2) swap(y1,y2);
return 2;
}
else
{
if(x1>x2) swap(x1,x2);
return 3;
}
}
void check()//检查是否合法
{
if(a[exa.r1][exa.c1]=='#') return ;
if(a[exa.r2][exa.c2]=='#') return;
if(exa.id==1&&(a[exa.r1][exa.c1]=='E'||a[exa.r2][exa.c2]=='E')) return ;
if(vis[exa.id][exa.r1][exa.c1]) return ;
if(exa.r1<1||exa.r2<1||exa.r1>n||exa.r2>n||exa.c1<1||exa.c2<1||exa.c1>m||exa.c2>m) return ;
vis[exa.id][exa.r1][exa.c1]=1;
que.push(exa);
}
int bfs()//搜索,和普通一样的写法
{
while(!que.empty()) que.pop();
memset(vis,0,sizeof(vis));
vis[ed.id][ed.r1][ed.c1]=1;
que.push(ed);
while(!que.empty())
{
ed=que.front();
//printf("%d (%d,%d),(%d,%d)\n",ed.id,ed.r1,ed.c1,ed.r2,ed.c2);
que.pop();
if(ed.id==1&&a[ed.r1][ed.c2]=='O') return ed.step;
for(int i=0;i<4;i++)
{
exa.r1=ed.r1+to[ed.id-1][i][0];
exa.c1=ed.c1+to[ed.id-1][i][1];
exa.r2=ed.r2+to[ed.id-1][i][2];
exa.c2=ed.c2+to[ed.id-1][i][3];
exa.step=ed.step+1;
exa.id=cmp(exa.r1,exa.c1,exa.r2,exa.c2); check();
// printf("id=%d (%d,%d),(%d,%d) i=%d\n",exa.id,exa.r1,exa.c1,exa.r2,exa.c2,i);
}
}
return -1;
} int main()
{
while(scanf("%d%d",&n,&m)!=EOF&&n+m)
{
int cnt=0,r1,c1,r2,c2;
for(int i=1;i<=n;i++)
{
scanf("%s",a[i]+1);
for(int j=1;j<=m;j++)
{
if(a[i][j]=='X')
{
cnt++;
if(cnt==1)
{
r1=r2=i;
c1=c2=j;
}
else
{
r2=i;
c2=j;
}
}
}
}
int t=cmp(r1,c1,r2,c2);
ed=node(t,r1,c1,r2,c2,0);
int exe=bfs();
if(exe==-1) printf("Impossible\n");
else printf("%d\n",exe);
}
return 0;
}
寒假训练——搜索 E - Bloxorz I的更多相关文章
- 寒假训练——搜索 K - Cycle
A tournament is a directed graph without self-loops in which every pair of vertexes is connected by ...
- 寒假训练——搜索——C - Robot
The Robot Moving Institute is using a robot in their local store to transport different items. Of co ...
- 寒假训练——搜索 G - Xor-Paths
There is a rectangular grid of size n×mn×m . Each cell has a number written on it; the number on the ...
- J - Abbott's Revenge 搜索 寒假训练
题目 题目大意:这个题目就是大小不超过9*9的迷宫,给你起点终点和起点的方向,让你进行移动移动特别之处是不一定上下左右都可以,只有根据方向确定可以走的方向.思路:需要写一个读入函数,这个需要读入起点, ...
- 寒假训练 A - A Knight's Journey 搜索
Background The knight is getting bored of seeing the same black and white squares again and again an ...
- 算法专题训练 搜索a-T3 Ni骑士(ni)
搞了半天八数码弄不出来就只好来打题解 这道题是在搜索a碰到的(链接: http://pan.baidu.com/s/1jG9rQsQ ) 感觉题目最大亮点就是这英文简写"ni", ...
- HRBUST - 2347 - 递归画图 - vj大一上寒假训练2.11
其他题可由本题变形得到. 思路:利用坐标dfs搜索. 注意:1,初始化.2,坐标实时更新(x,y) 代码: #include<iostream> #include<cstdio> ...
- 寒假集训——搜索 B - Sudoku
#include <stdio.h> #include <stdlib.h> #include <string.h> #include <iostream&g ...
- 寒假集训——搜索 D - Cubes for Masha
#include <stdio.h> #include <stdlib.h> #include <iostream> #include <string.h&g ...
随机推荐
- 第6章 Selenium2-Java 自动化测试模型
6.1 自动化测试模型介绍 6.1.1 线性测试 :其实就是单纯地来模拟用户完整的操作场景. 优势就是每一个脚本都是完整且独立的: 缺陷测试用例的开发与维护成本很高. 6.1.2 模块化驱动 ...
- thinkphp如何利用反射实现钩子方法
ThinkPHP框架的控制器模块是如何实现 前控制器.后控制器,及如何执行带参数的方法? PHP系统自带的 ReflectionClass.ReflectionMethod 类,可以反射用户自定义类的 ...
- SpringBoot入门之基于注解的Mybatis
今天学习下SpringBoot集成mybatis,集成mybatis一般有两种方式,一个是基于注解的一个是基于xml配置的.今天先了解下基于注解的mybatis集成. 一.引入依赖项 因为是mybat ...
- nfs 提高传输速度
通常挂载 nfs 的命令为: mount -t nfs -o nolock 192.168.0.124:/home/admin/rootfs /mnt 之前我一直都是用这个命令来挂载,那个传输速度啊, ...
- C#中构造函数的定义
C#构造函数是在创建给定类型的对象时执行的类方法.构造函数具有与类相同的名称,它通常初始化新对象的数据成员.不带参数的构造函数称为"默认构造函数". 无论何时,只要使用 new 运 ...
- kafka结合Spark-streming的直连(Direct)方式
说明:此程序使用的scala编写 在spark-stream+kafka使用的时候,有两种连接方式一种是Receiver连接方式,一种是Direct连接方式. 两种连接方式简介: Receiver接 ...
- JMeter 参数化之利用CSV Data Set Config从文件读取参数并关联变量
参数化之利用CSV Data Set Config从文件读取参数并关联变量 by:授客 QQ:1033553122 1. 添加CSV Data Set Config 右键线程组->配置元 ...
- 安卓界面之Viewpager和Tablayout实现滑动界面
摘要:六部实现选项卡界面 一. 在gradle文件添加以下代码: implementation 'com.android.support:design:28.0.0' 在gradle文件添加以上代码后 ...
- Flume Channel Selector
Flume 基于Channel Selector可以实现扇入.扇出. 同一个数据源分发到不同的目的,如下图. 在source上可以定义channel selector: 1 2 3 4 5 6 7 8 ...
- Expo大作战(三十八)--expo sdk api之 FileSystem(文件操作系统)
简要:本系列文章讲会对expo进行全面的介绍,本人从2017年6月份接触expo以来,对expo的研究断断续续,一路走来将近10个月,废话不多说,接下来你看到内容,讲全部来与官网 我猜去全部机翻+个人 ...