多连块是指由多个等大正方形边与边连接而成的平面连通图形。
– 维基百科

给一个大多连块和小多连块,你的任务是判断大多连块是否可以由两个这样的小多连块拼成。小多连块只能平移,不能旋转或者翻转。两个小多连块不得重叠。左下图是一个合法的拼法,但右边两幅图都非法。中间那幅图的问题在于其中一个小多连块旋转了,而右图更离谱:拼在一起的那两个多连块根本就不是那个给定的小多连块(给定的小多连块画在右下方)。

Input
输入最多包含20组测试数据。每组数据第一行为两个整数n和m(1<=m<=n<=10)。以下n行描述大多连块,其中每行恰好包含n个字符或者.,其中表示属于多连块,.表示不属于。以下m行为小多连块,格式同大多连块。输入保证是合法的多连块(注意,多连块至少包含一个正方形)。输入结束标志为n=m=0。
Output
对于每组测试数据,如果可以拼成,输出1,否则输出0。
Sample Input
4 3
.**.
****
.**.
….
**.
.**

3 3
***
*.*
***
*..
*..
**.
4 2
****
….
….
….
*.
*.
0 0
Sample Output
1
0
0
Hint

分析:
因为题中说不能旋转,所以枚举第一块和第二块的位置即可;
代码:

#include<iostream>
#include<cstring>
#include<cstdio> using namespace std;
const int N = + ; char goal[N][N];
char mat[N][N],st[N][N],tmp[N][N];
struct node{
int x,y;
}Node[];
int cnt,n,m;
void To_left_top(){
int dx=,dy=,i,j;
for(i=;i<m;i++){
for(j=;j<m;j++) if(st[i][j]=='*') break;
if(j == m) dx--;
else break;
}
for(j=;j<m;j++){
for(i=;i<m;i++) if(st[i][j]=='*') break;
if(i == m) dy--;
else break;
}
for(int i=;i<cnt;i++) Node[i].x+=dx,Node[i].y+=dy;
}
void print(){
for(int i=;i<cnt;i++){
mat[Node[i].x][Node[i].y] = '*';
}
for(int i=;i<m;i++){
for(int j=;j<m;j++){
printf("%c",mat[i][j]);
if(j==m-) printf("\n");
}
}
}
bool match(){
for(int i=;i<n;i++)
for(int j=;j<n;j++)
if(goal[i][j]!=tmp[i][j]) return false;
return true;
}
bool next_add(int x,int y){
memcpy(tmp,mat,sizeof(mat));
for(int i=;i<cnt;i++){
int newx = x + Node[i].x;
int newy = y + Node[i].y;
if(newx>=n || newy>=n || tmp[newx][newy]=='*') return false;
tmp[newx][newy] = '*';
}
if(match()) return true;
else return false;
}
bool add(int x,int y){
memset(mat,'.',sizeof(mat));
for(int i=;i<cnt;i++){
int newx = Node[i].x + x;
int newy = Node[i].y + y;
if(newx>=n || newy>= n) return false;
mat[newx][newy] = '*';
}
for(int i=;i<n;i++)
for(int j=;j<n;j++){
if(!next_add(i,j)) continue;
else return true;
}
return false;
}
bool solve(){
for(int i=;i<n;i++)
for(int j=;j<n;j++){
if(!add(i,j)) continue;
else return true;
}
return false;
}
int main(){
while(scanf("%d %d",&n,&m)== &&(n||m)){
cnt = ;
for(int i=;i<n;i++) scanf("%s",goal[i]);
for(int i=;i<m;i++){
scanf("%s",st[i]);
for(int j=;j<m;j++) if(st[i][j]=='*') Node[cnt].x = i,Node[cnt++].y = j;
}
To_left_top();
printf("%s\n",solve()?"":"");
}
}

D-多连块拼图的更多相关文章

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

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

  2. CSU 1102 多连块拼图

    多连块拼图 时间限制:1000 ms  |  内存限制:65535 KB 难度:4 描述     多连块是指由多个等大正方形边与边连接而成的平面连通图形.         ———— 维基百科      ...

  3. 拼图游戏 v1.1

    我一直对拼图游戏比较有兴趣,市面上卖的所谓“1000块拼图”也玩过不少,不过玩那个太占地方,后来也不再买了,同时也就萌生了在电脑上玩拼图的想法. 现在虽然有很多拼图游戏,但能大多数只能支持几十或几百块 ...

  4. H、CSL 的拼图 【多维点的交换】 (“新智认知”杯上海高校程序设计竞赛暨第十七届上海大学程序设计春季联赛)

    题目传送门:https://ac.nowcoder.com/acm/contest/551/H 题目描述 众所周知 CSL 不仅玩魔方很强,打麻将也很强.今天他打魔法麻将的时候,在路上撞到了一个被打乱 ...

  5. BZOJ 3873: [Ahoi2014]拼图

    BZOJ 3873: [Ahoi2014]拼图 标签(空格分隔): OI-BZOJ OI-DP Time Limit: 10 Sec Memory Limit: 256 MB Description ...

  6. gym/102021/J GCPC18 模拟拼图

    模拟拼图 题意: 给定n块拼图,每个拼图为四方形,对应四条边有四个数字,如果为0,表示这个边是在边界的,其他数字表示和另一个拼图的一条边相接.保证每个非零数只出现两次. 思路: 模拟,但是要注意几个情 ...

  7. [LOJ#500]「LibreOJ β Round」ZQC的拼图

    题目   点这里看题目. 分析   首先不难发现答案具有单调性,因此可以二分答案.答案上限为\(V=2m\times \max\{a_i, b_i\}\).   考虑如何去判断当前的答案.设这个答案为 ...

  8. 【转载 来自sdnlab】 开放网络没那么简单

    链接:开放网络没那么简单 本文是云杉网络工程师张攀对当前开源网络技术现状的一些思考和探索. 开放网元.释放数据的价值 从2012年开始至今,网络行业明显是O字辈的天下.所有我接触过了解过的组织和项目, ...

  9. codeforces 377A. Puzzles 水题

    A. Puzzles Time Limit: 20 Sec  Memory Limit: 256 MB 题目连接 http://codeforces.com/problemset/problem/33 ...

随机推荐

  1. [模板] Kruskal算法 && 克鲁斯卡尔重构树

    克鲁斯卡尔重构树 发现没把板子放上来... 现在放一下 克鲁斯卡尔算法的正确性是利用反证法证明的. 简要地说, 就是如果不加入当前权值最小的边 \(e_1\), 那么之后加入的边和这条边会形成一个环. ...

  2. (49)LINUX应用编程和网络编程之四 Linux进程全解

    补充: 1.  C程序的执行过程: C编译器调用链接器,链接器设置可执行程序文件的启动起始地址(启动例程),启动例程获得内核传递来的 命令行参数和环境变量值,为调用main函数做准备.[实际上该启动例 ...

  3. 大v用户数据统计分析

    1,统计数据的基本情况,包括微博总数,用户总数,最活跃和最不活跃的用户id #!/bin/sh source_dir=/home/minelab/data/DATA source_file_name= ...

  4. [nginx] CORS配置多域名

    如下 server { listen 80; server_name www.your.com; root /data/web/www.your.com; access_log /var/log/ng ...

  5. Java虚拟机JVM详解

    一.JVM内存管理 1.1JVM运行时数据区 1.1.1程序计数器:记录当前线程正在执行的字节码指定的地址(行号) 为什么需要它:程序容易被打断 1.1.2虚拟机栈:存储当前线程运行方法时所需要的数据 ...

  6. 【SpringBoot-创建项目】一.通过Idea创建SpringBoot项目

    一.首先我们通过Idea创建一个新项目 二.选择sdk和快速构建模板 三.填写项目基本信息 三.选择项目依赖 四.填写项目名和本地项目路径 六.完成项目创建,查看项目目录层级 最终:主要是在创建项目的 ...

  7. 初识linux命令

    1. type: 查看是外部命令/内部命令 外部命令 有存放地址信息 内部命令 is a shell builtin 2.file 查看文件的编码方式 file /sbin/ifconfig 编译执行 ...

  8. 第五周学习总结&实验报告(三)

    第五周学习总结&实验报告(三) 这一周又学习了新的知识点--继承. 一.继承的基本概念是: *定义一个类,在接下来所定义的类里面如果定义的属性与第一个类里面所拥有的属性一样,那么我们在此就不需 ...

  9. 关于Anaconda的虚拟环境操作

    # 1.创建虚拟环境 conda create -n env_name python==版本号 # 2.激活虚拟环境 conda activate env_name # 3.下载相关模块 pip in ...

  10. C# WPF 漂亮的loading 效果

    <UserControl x:Class="TestLoadPic.Loading" xmlns="http://schemas.microsoft.com/win ...