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

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

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. vue学习-day03(动画,组件)

    目录: 1.品牌列表-从数据库获取列表    2.品牌列表-完成添加功能    3.品牌列表-完成删除功能    4.品牌列表-全局配置数据接口的根域名    5.品牌列表-全局配置emulateJS ...

  2. The GuidRepresentation for the reader is CSharpLegacy, which requires the binary sub type to be Uuid

    使用客户端链接MongoDb报错 The GuidRepresentation for the reader is CSharpLegacy, which requires the binary su ...

  3. React 项目使用 React-router-dom 4.0 以上版本时使用 HashRouter 怎么控制 history

    不添加 history 时,来回点击 Link 会在控制台报错如下 Warning: Hash history cannot PUSH the same path; a new entry will ...

  4. 二分类算法的评价指标:准确率、精准率、召回率、混淆矩阵、AUC

    评价指标是针对同样的数据,输入不同的算法,或者输入相同的算法但参数不同而给出这个算法或者参数好坏的定量指标. 以下为了方便讲解,都以二分类问题为前提进行介绍,其实多分类问题下这些概念都可以得到推广. ...

  5. CentOS7服务器配置

    CentOS7服务器配置 1.更换yum软件源 下载阿里源 cd /etc/yum.repos.d sudo wget -nc http://mirrors.aliyun.com/repo/Cento ...

  6. 技术文档翻译-------glove readme(1)

    Package Contents To train your own GloVe vectors, first you tools. An example is included in demo.sh ...

  7. js获取Session问题

    纯htm页面必须采用AJAX了,ASP页面:var manager='<%=session("manager")%>', ASPX页面:var manager='< ...

  8. OpenStack 实现技术分解 (7) 通用库 — oslo_config

    目录 目录 前文列表 扩展阅读 osloconfig argparse cfgpy class Opt class ConfigOpts CONF 对象的单例模式 前文列表 OpenStack 实现技 ...

  9. 阶段3 1.Mybatis_09.Mybatis的多表操作_6 分析mybatis多对多的步骤并搭建环境

    示例:用户和角色             一个用户可以有多个角色             一个角色可以赋予多个用户         步骤:             1.建立两张表:用户表,角色表    ...

  10. lgb模板

    一 回归 1 提取训练集和测试集 2 制作标签,并检查标签是否有异常值 2 划分数据 https://www.jb51.net/article/152574.htm 3 建立model,写评价函数 h ...