20180414模拟赛T2——拼图
拼图
- 源程序名 puzzling.??? (PAS,BAS,C,CPP)
- 可执行文件名 puzzling.EXE
- 输入文件名 puzzling.IN
- 输出文件名 puzzling.OUT
- 时间限制 1S
- 内存限制 128MB
背景
潘帕斯草原最近流行起了一种拼图游戏,@潘帕斯雄鹰为了显示自己是最强的鹰,想尽办法要在这个游戏上赢过其他鹰……
题目描述
这个拼图游戏要求将一些图形拼成一个正方形,图形的个数从1到5。如下图所示,图形个数是4。

图形不能旋转,拼的时候不能重叠,拼完后的正方形里面不能有空隙。所有给定的图形都要使用。

左面的图表示这样拼不行,右面是一个成功的拼法。
现在,@潘帕斯雄鹰想知道他能否完成这个游戏以表示自己是最强的鹰;如果可以,请输出一种完成这个游戏的方案。
输入格式:
文件的第一行是一个整数n,表示图形的个数,范围从1到5。
接下来有n个部分,每个部分的第一行是2个整数i和j,表示下面的i行j列用来描述一个图形。图形用0和1表示,1表示图形占有这个位置,0表示不占有,中间没有空格。例如上图中图形A的描述是
2 3
111
101
所有图形的长与宽都不超过5。
根据图形给出的顺序给每个图形编号,从1开始,至多到5。
保证数据无多解情况。
输出文件:
如果不能拼成一个正方形,就输出“No solution possible”;否则,输出一种拼的方案:一个正方形的数阵,每个位置上的数字是占有这个位置的图形的编号,中间没有空格。例如上面A、B、C、D的编号依次是1、2、3、4,那么就可以输出
1112
1412
3422
3442
输入样例1:
4
1 4
1111
1 4
1111
1 4
1111
2 3
111
001
输出样例1:
No solution possible
输入样例2:
5
2 2
11
11
2 3
111
100
3 2
11
01
01
1 3
111
1 1
1
输出样例2:
1133
1153
2223
2444
题解
这题数据范围小,于是显然是深搜(dfs大法好)。
对了,得吐槽一下测试点1,2的数据:
puzzling.in
1
4 4
0000
0010
0000
0000
puzzling.ans
1
测试点2也差不多。
于是判边界的全炸了。
觉得这题主要考的是代码实现能力,就直接贴代码吧:
#include <cstdio>
#include <cstdlib>
#include <cstring>
using namespace std;
#define re register
int n,k,ans,a[10],b[10],s[10][10],xx[10],yy[10],f[10];
char c[10][10][10];
bool fk,flag[10];//flag[i]:i是否用过
inline int sqrt(int x)//c++自带sqrt可能会有精度问题,于是索性手打
{
for(register int i=0; i<=x; ++i)//反正x很小,枚举即可
{
int t=i*i;
if(t==x)return i;
if(t>x)return -1;
}
return -1;
}
inline void doit()//判断是否填成了一个正方形
{
int x=1,y=1,x1,y1;
memset(s,0,sizeof(s));
for(re int l=1;l<=n;++l)
{
for(;s[x][y];)
{
++y;if(y>k)y=1,++x;
}
x1=x-xx[f[l]];y1=y-yy[f[l]];
for(re int i=1;i<=a[f[l]];++i)
for(re int j=1;j<=b[f[l]];++j)
if(c[f[l]][i][j]=='1')
{
if(i+x1>k||j+y1>k||i+x1<=0||j+y1<=0)return;
if(!s[i+x1][j+y1])s[i+x1][j+y1]=f[l];
else return;
}
}
for(re int i=1;i<=k;++i,puts(""))
for(re int j=1;j<=k;++j)
printf("%d",s[i][j]);
exit(0);//直接退出程序
}
inline void dfs(int k)//愉快的dfs时间
{
if(k==n){doit();return;}
for(re int i=1;i<=n;++i)
if(!flag[i])
{
flag[i]=true;f[k+1]=i;
dfs(k+1);flag[i]=false;
}
}
int main()
{
freopen("puzzling.in","r",stdin);
freopen("puzzling.out","w",stdout);
scanf("%d",&n);
for(re int i=1;i<=n;++i)
{
scanf("%d%d\n",&a[i],&b[i]);
fk=false;
for(re int j=1;j<=a[i];++j)
{
for(int k=1;k<=b[i];++k)
{
c[i][j][k]=getchar();
if(c[i][j][k]=='1')ans++;
if(c[i][j][k]=='1'&&!fk){xx[i]=j;yy[i]=k;fk=true;}
}
getchar();//注意有'\n'
}
}
k=sqrt(ans);
if(k==-1)return puts("No solution possible"),0;
dfs(0);
return puts("No solution possible"),0;
}
20180414模拟赛T2——拼图的更多相关文章
- 模拟赛T2 交换 解题报告
模拟赛T2 交换 解题报告 题目大意: 给定一个序列和若干个区间,每次从区间中选择两个数修改使字典序最小. \(n,m\) 同阶 \(10^6\) 2.1 算法 1 按照题意模拟,枚举交换位置并比较. ...
- 20161003 NOIP 模拟赛 T2 解题报告
Weed duyege的电脑上面已经长草了,经过辨认上面有金坷垃的痕迹. 为了查出真相,duyege 准备修好电脑之后再进行一次金坷垃的模拟实验. 电脑上面有若干层金坷垃,每次只能在上面撒上一层高度为 ...
- NOIP欢乐模拟赛 T2 解题报告
小澳的坐标系 (coordinate.cpp/c/pas) [题目描述] 小澳者表也,数学者景也,表动则景随矣. 小澳不喜欢数学,可数学却待小澳如初恋,小澳睡觉的时候也不放过. 小澳的梦境中出现了一个 ...
- 20180530模拟赛T2——绀碧之棺
题目背景 qiancl 得到了一张藏宝图,上面写了一道谜题. 题目描述 定义\(F(n)\)为 n 在十进制下各个数位的平方和,求区间\([a,b]\)中有多少\(n\)满足\(k\times F(n ...
- 20180519模拟赛T2——pretty
[问题描述] 小美今天对于数列很有兴趣.小美打算找出一些漂亮的序列.一个漂亮的序列的限制如下: 长度为 n ,而且数列里只包含 [1,n] 的整数. 要不是不降的序列就是不升的序列. 小美想知道有多少 ...
- 2019.11.11 模拟赛 T2 乘积求和
昨天 ych 的膜你赛,这道题我 O ( n4 ) 暴力拿了 60 pts. 这道题的做法还挺妙的,我搞了将近一天呢qwq 题解 60 pts 根据题目给出的式子,四层 for 循环暴力枚举统计答案即 ...
- 5.12 省选模拟赛 T2 贪心 dp 搜索 差分
LINK:T2 这题感觉很套路 但是不会写. 区间操作 显然直接使用dp不太行 直接爆搜也不太行复杂度太高. 容易想到差分 由于使得整个序列都为0 那么第一个数也要i差分前一个数 强行加一个0 然后 ...
- 20161023 NOIP 模拟赛 T2 解题报告
Task 2.回文串计数 (calc.pas/calc.c/calc.cpp) [题目描述] 虽然是一名理科生,Mcx常常声称自己是一名真正的文科生.不知为何,他对于背诵总有一种莫名的热爱,这也促使他 ...
- 20161005 NOIP 模拟赛 T2 解题报告
beautiful 2.1 题目描述 一个长度为 n 的序列,对于每个位置 i 的数 ai 都有一个优美值,其定义是:找到序列中最 长的一段 [l, r],满足 l ≤ i ≤ r,且 [l, r] ...
随机推荐
- sql的插入或者修改
<select id="insertOrUpdateTenantDetail" parameterType="tenantDetailDO"> IN ...
- 最近C#项目中不小心踩的低级坑
都是很基础的错误问题,大部分都是因为不查一下资料就直接根据其它类似语言的经验写代码导致的 1. 一个企业微信上的正常的界面突然不能滚动了 本以为是浏览器代码计算问题,结果发现是JS出错导致. 2. R ...
- 第五节:管道中间件入门(Use、Run、Map)
一. 简介 1.中间件是一种装配到应用管道以处理请求和响应的组件,每个组件可以选择是否把请求传递到管道中的下一个组件.可在管道中的下一个组件的前后执行工作.请求管道中的每一个组件负责调用管道中的下一个 ...
- DDR3(4):读控制
写控制完成后开始设计读控制,写控制和读控制是非常相似的. 一.总线详解 由 User Guide 可知各信号之间的逻辑关系,读数据是在给出命令之后一段时间后开始出现的.图中没有给出app_rd_dat ...
- maven添加本地包命令mvn install:install-file
mvn install:install .jar -Dfile:要注册的jar,绝对路径
- APS.NET MVC + EF (02)---ADO.NET Entity FrameWork
2.1 Entity Framework简介 Ado.net Entity Framework 是Microsoft推出的ORM框架. 2.1.1 什么是ORM 对象关系映射(Object Relat ...
- ELK部署配置使用记录
为什么要用ELK: 一般我们需要进行日志分析场景:直接在日志文件中 grep.awk 就可以获得自己想要的信息.但在规模较大的场景中,此方法效率低下,面临问题包括日志量太大如何归档.文本搜索太慢怎么办 ...
- git 忽略提交
在git中如果想忽略掉某个文件,不让这个文件提交到版本库中,可以使用修改 .gitignore 文件的方法. git目录下新建一个.gitignore(window下使用git bash工具或者cmd ...
- HTML5深入学习之 WebSQL 数据库
概述 WebSQL 并不是 HTML5规范的一部分,而是一个独立的规范,它可以用来做一些离线应用 核心API openDatabase() => 用来打开或创建数据库(没有时则创建,有则打开) ...
- js 对象克隆方法总结(不改变原对象)
1.通用对象克隆: function clone(obj){ let temp = null; if(obj instanceof Array){ temp = obj.concat(); }else ...