拼图

  • 源程序名   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——拼图的更多相关文章

  1. 模拟赛T2 交换 解题报告

    模拟赛T2 交换 解题报告 题目大意: 给定一个序列和若干个区间,每次从区间中选择两个数修改使字典序最小. \(n,m\) 同阶 \(10^6\) 2.1 算法 1 按照题意模拟,枚举交换位置并比较. ...

  2. 20161003 NOIP 模拟赛 T2 解题报告

    Weed duyege的电脑上面已经长草了,经过辨认上面有金坷垃的痕迹. 为了查出真相,duyege 准备修好电脑之后再进行一次金坷垃的模拟实验. 电脑上面有若干层金坷垃,每次只能在上面撒上一层高度为 ...

  3. NOIP欢乐模拟赛 T2 解题报告

    小澳的坐标系 (coordinate.cpp/c/pas) [题目描述] 小澳者表也,数学者景也,表动则景随矣. 小澳不喜欢数学,可数学却待小澳如初恋,小澳睡觉的时候也不放过. 小澳的梦境中出现了一个 ...

  4. 20180530模拟赛T2——绀碧之棺

    题目背景 qiancl 得到了一张藏宝图,上面写了一道谜题. 题目描述 定义\(F(n)\)为 n 在十进制下各个数位的平方和,求区间\([a,b]\)中有多少\(n\)满足\(k\times F(n ...

  5. 20180519模拟赛T2——pretty

    [问题描述] 小美今天对于数列很有兴趣.小美打算找出一些漂亮的序列.一个漂亮的序列的限制如下: 长度为 n ,而且数列里只包含 [1,n] 的整数. 要不是不降的序列就是不升的序列. 小美想知道有多少 ...

  6. 2019.11.11 模拟赛 T2 乘积求和

    昨天 ych 的膜你赛,这道题我 O ( n4 ) 暴力拿了 60 pts. 这道题的做法还挺妙的,我搞了将近一天呢qwq 题解 60 pts 根据题目给出的式子,四层 for 循环暴力枚举统计答案即 ...

  7. 5.12 省选模拟赛 T2 贪心 dp 搜索 差分

    LINK:T2 这题感觉很套路 但是不会写. 区间操作 显然直接使用dp不太行 直接爆搜也不太行复杂度太高. 容易想到差分 由于使得整个序列都为0 那么第一个数也要i差分前一个数 强行加一个0 然后 ...

  8. 20161023 NOIP 模拟赛 T2 解题报告

    Task 2.回文串计数 (calc.pas/calc.c/calc.cpp) [题目描述] 虽然是一名理科生,Mcx常常声称自己是一名真正的文科生.不知为何,他对于背诵总有一种莫名的热爱,这也促使他 ...

  9. 20161005 NOIP 模拟赛 T2 解题报告

    beautiful 2.1 题目描述 一个长度为 n 的序列,对于每个位置 i 的数 ai 都有一个优美值,其定义是:找到序列中最 长的一段 [l, r],满足 l ≤ i ≤ r,且 [l, r] ...

随机推荐

  1. Kafka session.timeout.ms heartbeat.interval.ms参数的区别以及对数据存储的一些思考

    Kafka session.timeout.ms heartbeat.interval.ms参数的区别以及对数据存储的一些思考 在计算机世界中经常需要与数据打交道,这也是我们戏称CURD工程师的原因之 ...

  2. TP5 按照汉字的拼音排序

    业务需求:接口返回一个列表,但是这个列表要求按一定的条件排序,条件如下: 1,某字段(field1)为null的排前面 2,某字段(field2)为null的排前面 3,姓名(field3)按照汉字的 ...

  3. [SOJ #696]染色(2019-11-10考试)/[Atcoder MUJIN Programming Challenge C]Orange Graph

    题目大意 有一个\(n\)个点\(m\)条边的简单无向连通图,初始为白色,可以执行操作让一些边变黑,要求使得操作后的图不存在黑色的奇环,且不能使得其他的任何变黑而还符合要求.问最后有多少可能结果.\( ...

  4. Java学习:方法的使用与注意事项

    方法的使用与注意事项 定义一个方法的格式:public static void 方法名称(){ 方法体 } 如何调用方法,格式: 方法名称(): 方法名称的命名规则和变量一样,使用小驼峰. 方法体:也 ...

  5. mybatis-plus 主键自增问题

    主键不自增:返回值是插入的条数 <insert id="add" parameterType="EStudent"> insert into TSt ...

  6. 静下心来学jquery的用法

    http://blog.csdn.net/xiaojun1288/article/details/6803552

  7. C# 创建json传输格式的http请求

    public static string PostRequestTest(string content, string url, string contentType = "applicat ...

  8. WCF学习笔记(一)---我的第一个WCF程序

    一.创建WCF程序   1.创建一个控制台程序(WCFBlog)   2.添加wcf项目   3.将默认的IService1和Service1改成自己的名字   4.在ICalculateServic ...

  9. java中的进制与操作符

    直接常量 double: 111d,111D 二进制:前缀为0b 十六进制:前缀为0x或0X,后面最大9位. 八进制:前缀为0,后面最大7位. 按位操作符 与(&): 或(||): 异或(^) ...

  10. 前端1-----A标签 (锚点)

    Title 头部,顶端, 点击跳转到id='abc' 1 2 到百度这里,点击跳转百度 3 到这里了 4 alex1 5 6 根据id 从底部到头      根据id='a1' 到指定位置      ...