嘟嘟嘟




一眼看上去像状压dp,然后越想复杂度越不对劲,最后发现和爆搜差不多,索性就写爆搜了,复杂度\(O(\)能过\()\)。

别忘了填拼图和回溯的时候只动拼图中是1的部分,不要把\(n * m\)的矩形全改了。

#include<cstdio>
#include<iostream>
#include<cmath>
#include<algorithm>
#include<cstring>
#include<cstdlib>
#include<cctype>
#include<vector>
#include<stack>
#include<queue>
using namespace std;
#define enter puts("")
#define space putchar(' ')
#define Mem(a, x) memset(a, x, sizeof(a))
#define In inline
typedef long long ll;
typedef double db;
const int INF = 0x3f3f3f3f;
const db eps = 1e-8;
const int maxn = 17;
const int N = 4;
inline ll read()
{
ll ans = 0;
char ch = getchar(), last = ' ';
while(!isdigit(ch)) last = ch, ch = getchar();
while(isdigit(ch)) ans = (ans << 1) + (ans << 3) + ch - '0', ch = getchar();
if(last == '-') ans = -ans;
return ans;
}
inline void write(ll x)
{
if(x < 0) x = -x, putchar('-');
if(x >= 10) write(x / 10);
putchar(x % 10 + '0');
} int n;
struct Puzzle
{
int n, m, num;
char a[maxn][maxn];
}t[maxn]; In void calc(int x)
{
for(int i = 1; i <= t[x].n; ++i)
for(int j = 1; j <= t[x].m; ++j)
if(t[x].a[i][j] == '1') ++t[x].num;
} int f[maxn][maxn], Ans[maxn][maxn], Flg = -1;
In void copy_ans()
{
for(int i = 1; i <= N; ++i)
for(int j = 1; j <= N; ++j) Ans[i][j] = f[i][j];
}
In bool check(int now, int x, int y)
{
for(int i = x; i <= x + t[now].n - 1; ++i)
for(int j = y; j <= y + t[now].m - 1; ++j)
if(f[i][j] && t[now].a[i - x + 1][j - y + 1] == '1') return 0;
return 1;
}
In void copy(int now, int x, int y, bool flg)
{
for(int i = 1; i <= t[now].n; ++i)
for(int j = 1; j <= t[now].m; ++j)
if(t[now].a[i][j] == '1')
f[i + x - 1][j + y - 1] = flg ? now : 0;
}
In void dfs(int now)
{
if(Flg > 0) return;
if(now == n + 1) {++Flg; copy_ans(); return;}
for(int i = 1; i <= N - t[now].n + 1; ++i)
for(int j = 1; j <= N - t[now].m + 1; ++j)
if(check(now, i, j))
{
copy(now, i, j, 1);
dfs(now + 1);
copy(now, i, j, 0);
}
} int main()
{
while(scanf("%d", &n) != EOF)
{
Flg = -1; Mem(f, 0);
int sum = 0;
for(int i = 1; i <= n; ++i)
{
t[i].n = read(), t[i].m = read(); t[i].num = 0;
for(int j = 1; j <= t[i].n; ++j) scanf("%s", t[i].a[j] + 1);
calc(i); sum += t[i].num;
}
if(sum ^ 16) {puts("No solution"); continue;}
dfs(1);
if(Flg == -1) puts("No solution");
else if(Flg > 0) puts("Yes, many!");
else
{
puts("Yes, only one!");
for(int i = 1; i <= N; ++i)
{
for(int j = 1; j <= N; ++j) write(Ans[i][j]);
enter;
}
}
}
return 0;
}

[TJOI2014]拼图的更多相关文章

  1. 拼图小游戏之计算后样式与CSS动画的冲突

    先说结论: 前几天写了几个非常简单的移动端小游戏,其中一个拼图游戏让我郁闷了一段时间.因为要获取每张图片的位置,用`<style>`标签写的样式,直接获取计算后样式再用来交换位置,结果就悲 ...

  2. JavaScript版拼图小游戏

    慕课网上准备开个新的jQuery教程,花了3天空闲时间写了一个Javascript版的拼图小游戏,作为新教程配套的分析案例 拼图游戏网上有不少的实现案例了,但是此源码是我自己的实现,所以不做太多的比较 ...

  3. 利用Vue.js实现拼图游戏

    之前写过一篇<基于Vue.js的表格分页组件>的文章,主要介绍了Vue组件的编写方法,有兴趣的可以访问这里进行阅读:http://www.cnblogs.com/luozhihao/p/5 ...

  4. WPF学习系列 游戏-选张图片做成9宫格拼图

    今天要学习一个拼图项目. 目标是传入一张图片,然后将它分成9份,去掉一份,鼠标点击进行拼图. 源文件结构很简单 第一步.新建项目 这一步没什么好说的,新建一个项目就跟源文件结构一样了 第二步.页面布局 ...

  5. 原生js完成拼图小游戏

    废话不说,看代码,图片可以自己找,我这直接引用了百度的了 <!DOCTYPE html> <html xmlns="http://www.w3.org/1999/xhtml ...

  6. ACM: NBUT 1105 多连块拼图 - 水题 - 模拟

    NBUT 1105  多连块拼图 Time Limit:1000MS     Memory Limit:65535KB     64bit IO Format:  Practice  Appoint ...

  7. JavaScript拼图游戏

    今天是2016年最后一天上班了.最近几天都比较休闲,有时间空闲下来写写文档之类的. 2016过得真是快.感觉没做什么就过去了.想到之前想坚持每个月写一写博客都没坚持到.希望2017年可以吧. 无聊之余 ...

  8. MyFirstgame 拼图

    package auto; /** * IDA*求解15puzzle问题 * IDA*整合了IDDFS和A*算法.其中IDDFS控制了求解过程中的内存开销,A*算法意味着"启发式" ...

  9. 关于有偿提供拼图响应式后台的通知---------pintuer ui的官方通知(www.pintuer.com)

    拼图响应式前端框架版响应式后台正式发布. 考虑到目前拼图的状况,我们不打算免费开放下载,但也不会收各位朋友1分钱,该版后台将有偿提供给各位给予拼图贡献的朋友. 废话不多说,一切皆以有图有真相,下面上图 ...

随机推荐

  1. react学习(一)

    组件和属性(props) 函数式组件: function Welcome(props) { return <h1>Hello, {props.name}</h1>; } 渲染一 ...

  2. 微信小程序之发送模板消息(通过openid推送消息给用户)

    一.获取access_token access_token是接口调用的凭证,目前有效期为两个小时,需要定时刷新,重复获取将导致上次获取的access_token失效.(注:不建议每次调用需要acces ...

  3. jquery - append prepend after before animate clearQueue stop

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

  4. JS之函数实际参数转换成数组的方法[].slice.call(arguments)

    实际参数在函数中我们可以使用 arguments 对象获得 (注:形参可通过 arguments.callee 获得),虽然 arguments 对象与数组形似,但仍不是真正意义上的数组. 我们可以通 ...

  5. JavaScript面向对象编程指南(六) 继承

    第6章 继承 6.1 原型链 6.1.1原型链示例 原型链法:Child.prototype=new Parent(); <script> function Shape(){ this.n ...

  6. js获取选中日期的当周的周一和周日

    js获取选中日期的当周的周一和周日 第一种方法(推荐): function getWeekStr(str) { // 将字符串转为标准时间格式 str2 = Date.parse(str); let ...

  7. Android开启相机预览获取Yuv视频流数据

    自定义SurfaceView 主要步骤: 实现SurfaceHolder.Callback接口,创建SurfaceView的生命周期 实现Camera.PreviewCallback接口,创建预览回调 ...

  8. HDU 1722 Cake (数论 gcd)(Java版)

    Big Number 题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1722 ——每天在线,欢迎留言谈论. 题目大意: 给你两个数 n1,n2 . 然后 ...

  9. coTurn 使用测试方法

    做个记录 1.从"../examples/etc/" 目录拷贝turnserver.conf文件到"/usr/local/etc/"目录 2.修改配置文件 主要 ...

  10. AngularJS学习之旅—AngularJS 指令(三)

    1.AngularJS 指令 AngularJS 通过被称为 指令 的新属性来扩展 HTML. AngularJS 通过内置的指令来为应用添加功能. AngularJS 允许你自定义指令.2.Angu ...