寒假训练——搜索 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 ...
随机推荐
- [深度学习]理解RNN, GRU, LSTM 网络
Recurrent Neural Networks(RNN) 人类并不是每时每刻都从一片空白的大脑开始他们的思考.在你阅读这篇文章时候,你都是基于自己已经拥有的对先前所见词的理解来推断当前词的真实含义 ...
- php获取当前是星期几
<?php $weekarray=array("日","一","二","三","四",&quo ...
- Hibernate学习(三)———— 一对多映射关系
序言 前面两节讲了hibernate的两个配置文件和hello world!.还有hibernate的一级缓存和三种状态,基本上hibernate就懂一点了,从这章起开始一个很重要的知识点,hiber ...
- Java基础之Java 修饰符
前言:Java内功心法之Java 修饰符,看完这篇你向Java大神的路上又迈出了一步(有什么问题或者需要资料可以联系我的扣扣:734999078) Java语言提供了很多修饰符,主要分为以下两类: 访 ...
- [SPOJ22343] Norma
Description 现在有一个长度为\(N(N\leq 500000)\)的序列,定义区间\([l,r]\)的价值为\([l,r]\)的最小值乘上\([l,r]\)的最大值乘上\([l,r]\)的 ...
- [SDOI2010] 外星千足虫
Description 公元2089年6月4日,在经历了17年零3个月的漫长旅行后,"格纳格鲁一号"载人火箭返回舱终于安全着陆.此枚火箭由美国国家航空航天局(NASA)研制发射,行 ...
- hadoop 集群中数据块的副本存放策略
HDFS采用一种称为机架感知(rack-aware)的策略来改进数据的可靠性.可用性和网络带宽的利用率.目前实现的副本存放策略只是在这个方向上的第一步.实现这个策略的短期目标是验证它在生产环境下的有效 ...
- MVC之Ajax异步操作
在页面的局部通过Html.Action加载一块分布页,我们可以通过Ajax异步去更换或更新这块分布页 通过一个下拉框值发生变化的时候,我们会去从后台重新访问这个action获取一个新的View,然后替 ...
- Java 图形化界面设计(GUI)实战练习(代码)
关于Java图形化界面设计,基础知识网上可搜,下面简单介绍一下重点概念,然后就由浅入深代码实例. 程序是为了方便用户使用的,Java引入图形化界面编程. 1.JFrame 是容器类 2.AWT 是抽象 ...
- 【Spring】13、使用Spring 3的@value简化配置文件的读取
Spring 3支持@value注解的方式获取properties文件中的配置值,大简化了读取配置文件的代码. 1.在applicationContext.xml文件中配置properties文件 & ...