传送门

Description

有一块\(n\)行\(m\)列的网格板, \(n,m\)都是奇数。网格上平铺着一些\(1*2\)的积木。积木可以旋转,不能重叠。网格板上只有一格的空位。

你可以做两种操作:

  1. 将一块与空白格相邻(指有公共边)的积木旋转\(90^{\circ}\)到空白格中;
  2. 将一块与空白格相邻的积木平移至空白格中。

如图所示(被移动的积木颜色较浅):

请你用以上两种操作将给定的网格板变换为指定的状态。

Solution 

发现并没有要求用最短的步骤(笑。。。

其实,每次改变空格的位置的同时,都可以顺便使得目标状态中这个空格位置的木块归位

移着移着,就移到目标状态中的空格的位置了

但是此时我们只能保证移动路线上的木块都归位了,所以我们需要dfs,如果碰到不合法就使其归位,这样的移动路径必然会是一个环,所以我们又回到了最初不合法的位置

每个格子只需被搜索一次,因为搜索完某个格子后,它的木块必然已经归位了。

原来是大模拟啊

Code 

#include<bits/stdc++.h>
#define dbg1(x) cerr<<#x<<"="<<(x)<<" "
#define dbg2(x) cerr<<#x<<"="<<(x)<<"\n"
#define dbg3(x) cerr<<#x<<"\n"
#define ll long long
using namespace std;
#define reg register
const int MN=2005;
const int tr[4][2]={{0,2},{1,3},{2,0},{3,1}};
const int dx[4]={0,-1,0,1},dy[4]={-1,0,1,0};
const char ch[4]={'L','U','R','D'};
int N,M,x,y,xp,yp,len;
char a[MN][MN],c[(MN*MN)<<1];
int ta[MN][MN],tb[MN][MN];
bool vis[MN][MN]; void init(int (*ts)[MN],int &_x,int &_y)
{
reg int i,j;
for(i=1;i<=N;++i) scanf("%s",a[i]+1);
for(i=1;i<=N;++i)for(j=1;j<=M;++j)
switch(a[i][j])
{
case 'o':_x=i,_y=j;ts[i][j]=-1;break;
case '<':ts[i][j]=2;break;
case '>':ts[i][j]=0;break;
case 'n':ts[i][j]=3;break;
case 'u':ts[i][j]=1;break;
}
}
void one_step(int k)
{
c[len++]=ch[k];
int xi=x+dx[k],yi=y+dy[k];
int xj=xi+dx[ta[xi][yi]],yj=yi+dy[ta[xi][yi]];
ta[x][y]=tr[k][0];ta[xi][yi]=tr[k][1];
ta[x=xj][y=yj]=-1;
} void Walk_to_o(int X,int Y)
{
while((x^X)||(y^Y))
one_step(tb[x][y]);
} void dfs(int X,int Y)
{
if(vis[X][Y]) return;
vis[X][Y]=true;
for(int i=0;i<4;++i)
{
int xi=X+dx[i],yi=Y+dy[i];
if(xi>N||xi<1||yi<1||yi>M||vis[xi][yi]) continue;
int xj=xi+dx[tb[xi][yi]],yj=yi+dy[tb[xi][yi]]; if(ta[xi][yi]^tb[xi][yi])
one_step(i),Walk_to_o(xj,yj),one_step(tb[xj][yj]);
one_step(i);
vis[xi][yi]=true;
dfs(xj,yj);
one_step(tb[xj][yj]);
}
} int main()
{
scanf("%d%d",&N,&M);
init(ta,x,y);init(tb,xp,yp); Walk_to_o(xp,yp); dfs(xp,yp);
return 0*printf("%s\n",c);
}

Blog来自PaperCloud,未经允许,请勿转载,TKS!

「SNOI2019」积木的更多相关文章

  1. Loj #3096. 「SNOI2019」数论

    Loj #3096. 「SNOI2019」数论 题目描述 给出正整数 \(P, Q, T\),大小为 \(n\) 的整数集 \(A\) 和大小为 \(m\) 的整数集 \(B\),请你求出: \[ \ ...

  2. 【LOJ】#3098. 「SNOI2019」纸牌

    LOJ#3098. 「SNOI2019」纸牌 显然选三个以上的连续牌可以把他们拆分成三个三张相等的 于是可以压\((j,k)\)为有\(j\)个连续两个的,有\(k\)个连续一个的 如果当前有\(i\ ...

  3. 【LOJ】#3097. 「SNOI2019」通信

    LOJ#3097. 「SNOI2019」通信 费用流,有点玄妙 显然按照最小路径覆盖那题的建图思路,把一个点拆成两种点,一种是从这个点出去,标成\(x_{i}\),一种是输入到这个点,使得两条路径合成 ...

  4. 【LOJ】#3096. 「SNOI2019」数论

    LOJ#3096. 「SNOI2019」数论 如果\(P > Q\)我们把\(P\)和\(Q\)换一下,现在默认\(P < Q\) 这个时候每个合法的\(a_i\)都可以直接落到\(Q\) ...

  5. 【LOJ】#3095. 「SNOI2019」字符串

    LOJ#3095. 「SNOI2019」字符串 如果两个串\(i,j\)比较\(i < j\),如果离\(a_{i}\)最近的不同的数是\(a_{k}\),如果\(j < k\)那么\(i ...

  6. 【题解】「P1504」积木城堡

    这题是01背包(\(DP\)) 如何判断要拆走那个积木,首先定义一个\(ans\)数组,来存放这对积木能拼成多高的,然后如果\(ans_i = n\)那么就说明这个高度的积木可以. 话不多说,上代码! ...

  7. 「SNOI2019」通信

    题目 还好我没生在陕西啊 首先发现这个题不能\(dp\),数据范围不大,好像一种网络流的样子啊 哎等等,这样向后面连边不是一个\(DAG\)吗,这不是最小权路径覆盖的板子吗 于是我们套路的拆点,对于一 ...

  8. 「SNOI2019」字符串

    题目 看起来非常一眼啊,我们完全可以\(std::sort\)来解决这歌问题 于是现在的问题转化成了比较函数怎么写 随便画一下就会发现前面的好几位是一样的,后面的好几位也是一样,只需要比较中间的一段子 ...

  9. 「SNOI2019」通信 分治建图

    根据题意 每个点可以直接与S,T相连 也可以和前面的哨站相连 暴力建边的话 有n2条边 要用分治优化建边: 类似于归并排序 先对每一层分为左半边与右半边 对每一半都拿出来先排序去重后 直接排成一条链建 ...

随机推荐

  1. linux 流量监控利器:iftop

    在类Unix系统中可以使用top查看系统资源.进程.内存占用等信息. 查看网络状态可以使用netstat.nmap等工具. 若要查看实时的网络流量,监控TCP/IP连接等,则可以使用iftop. if ...

  2. 全网最easy的better-scroll实现上拉加载和下拉刷新

    前言 移动端页面常见的一种效果:下拉刷新(pulldownrefresh)和上拉加载(pullupload),目的都是为了增强用户的体验效果,因此各种移动端滑动插件也是层出不穷,今天小编也在这里给大家 ...

  3. webpack练手项目之easySlide(一):初探webpack

    最近在学习webpack,正好拿了之前做的一个小组件,图片轮播来做了下练手,让我们一起来初步感受下webpack的神奇魅力.     webpack是一个前端的打包管理工具,大家可以前往:http:/ ...

  4. 阿里云搭建git服务器

    阿里云服务器环境: CentOS7.0 jdk1.8.0 jre1.8.0 RAM:1G SWAP:3G MEM:40G apache-tomcat 8.0 1.下载gitlab-ce 11.0 到本 ...

  5. 【等待事件】等待事件系列(5.1)--Enqueue(队列等待)

    [等待事件]等待事件系列(5.1)--Enqueue(队列等待)   1  BLOG文档结构图   2  前言部分   2.1  导读和注意事项 各位技术爱好者,看完本文后,你可以掌握如下的技能,也可 ...

  6. Python学习日记(三十五) Mysql数据库篇 三

    使用Navicate 创建一个连接去使用Mysql的数据库,连接名可以取任意字符但是要有意义 新增一个数据库 填写新数据库名,设置它的字符集和排序规则 新建一个表 增加表中的信息 点击保存再去输入表名 ...

  7. QQ推广工具

    目前比较简单易用的QQ推广工具有:一键加群.在线聊天 一.一键加群 1.官网链接 http://qun.qq.com/join.html 2.使用 1登录自己的QQ 2创建一个想要作为推广的群 3选择 ...

  8. Linux kernel启动选项(参数)(转)

    Linux kernel启动选项(参数)  转载链接https://www.cnblogs.com/linuxbo/p/4286227.html 在Linux中,给kernel传递参数以控制其行为总共 ...

  9. 【Spring Boot】Spring Boot之自定义拦截器

    一.拦截器的作用 将通用的代码抽取出来,达到复用的效果.比如可以用来做日志记录.登录判断.权限校验等等 二.如何实现自定义拦截器 1)创建自定义拦截器类并实现HandlerInterceptor类 / ...

  10. Give root password for maintenance

    linux开机出现"Give root password for maintenance (or type Control-D to continue):" 出现这种情况一般为两种 ...