传送门

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. Vue 项目 VSCode 调试

    调试Vue搭建的前端项目 在项目根目录下的vue.config.js中添加: module.exports = { lintOnSave: false, //关闭eslint语法校验 //填写这部分 ...

  2. MongoDB和Java(7):MongoDB用户管理

    最近花了一些时间学习了下MongoDB数据库,感觉还是比较全面系统的,涉及了软件安装.客户端操作.安全认证.副本集和分布式集群搭建,以及使用Spring Data连接MongoDB进行数据操作,收获很 ...

  3. mybatis 变更xml文件目录

    mybatis的xml默认读取的是resources目录,这个目录是可以变化的.我习惯于将mapper文件和xml放到一起或相邻目录下. 如图: 具体操作: 以mybatis-plus为例 boots ...

  4. python day 18: thinking in UML与FTP作业重写

    目录 python day 18 1. thinking in UML读书小感 2. FTP作业重写 2.1 软件目录结构 2.2 FTPClient端脚本 2.3 FTPServer端脚本 pyth ...

  5. Java 之 MyBatis(一)入门

    一.Mybatis 框架概述 (1)mybatis 是一个优秀的基于 java 的持久层框架,它内部封装了 jdbc,使开发者只需要关注 sql 语句本身,而不需要花费精力去处理加载驱动.创建连接.创 ...

  6. Redis_初识

    一.简介 Redis(Remote Dictionary Server)本质上是一个Key-Value类型的内存数据库,整个数据库统统加载在内存当中进行操作,定期通过异步操作吧数据库flush到硬盘上 ...

  7. MySQL Lock--MySQL INSERT加锁学习

    准备测试数据: ## 开启InnoDB Monitor SET GLOBAL innodb_status_output=ON; SET GLOBAL innodb_status_output_lock ...

  8. 06-jQuery进阶

    本篇主要介绍jQuery的正则.冒泡事件.委托事件.以及DOM操作.JavaScript对象以及ajax等知识: 一.正则 简而言之,正则的规则无论是各种语言均是通用的,故其规则中的字符便不再介绍了, ...

  9. centos下安装opencv

    根据项目需要,安装opencv并提供给开发使用,并且使用opencv提供python3的API接口.虽然不知道是个啥,还是简单了解下. opencv是什么? OpenCV的全称是Open Source ...

  10. Cloudera Certified Associate Administrator案例之Configure篇

    Cloudera Certified Associate Administrator案例之Configure篇 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.下载CDH集群中最 ...