D-多连块拼图
多连块是指由多个等大正方形边与边连接而成的平面连通图形。
– 维基百科
给一个大多连块和小多连块,你的任务是判断大多连块是否可以由两个这样的小多连块拼成。小多连块只能平移,不能旋转或者翻转。两个小多连块不得重叠。左下图是一个合法的拼法,但右边两幅图都非法。中间那幅图的问题在于其中一个小多连块旋转了,而右图更离谱:拼在一起的那两个多连块根本就不是那个给定的小多连块(给定的小多连块画在右下方)。
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-多连块拼图的更多相关文章
- ACM: NBUT 1105 多连块拼图 - 水题 - 模拟
NBUT 1105 多连块拼图 Time Limit:1000MS Memory Limit:65535KB 64bit IO Format: Practice Appoint ...
- CSU 1102 多连块拼图
多连块拼图 时间限制:1000 ms | 内存限制:65535 KB 难度:4 描述 多连块是指由多个等大正方形边与边连接而成的平面连通图形. ———— 维基百科 ...
- 拼图游戏 v1.1
我一直对拼图游戏比较有兴趣,市面上卖的所谓“1000块拼图”也玩过不少,不过玩那个太占地方,后来也不再买了,同时也就萌生了在电脑上玩拼图的想法. 现在虽然有很多拼图游戏,但能大多数只能支持几十或几百块 ...
- H、CSL 的拼图 【多维点的交换】 (“新智认知”杯上海高校程序设计竞赛暨第十七届上海大学程序设计春季联赛)
题目传送门:https://ac.nowcoder.com/acm/contest/551/H 题目描述 众所周知 CSL 不仅玩魔方很强,打麻将也很强.今天他打魔法麻将的时候,在路上撞到了一个被打乱 ...
- BZOJ 3873: [Ahoi2014]拼图
BZOJ 3873: [Ahoi2014]拼图 标签(空格分隔): OI-BZOJ OI-DP Time Limit: 10 Sec Memory Limit: 256 MB Description ...
- gym/102021/J GCPC18 模拟拼图
模拟拼图 题意: 给定n块拼图,每个拼图为四方形,对应四条边有四个数字,如果为0,表示这个边是在边界的,其他数字表示和另一个拼图的一条边相接.保证每个非零数只出现两次. 思路: 模拟,但是要注意几个情 ...
- [LOJ#500]「LibreOJ β Round」ZQC的拼图
题目 点这里看题目. 分析 首先不难发现答案具有单调性,因此可以二分答案.答案上限为\(V=2m\times \max\{a_i, b_i\}\). 考虑如何去判断当前的答案.设这个答案为 ...
- 【转载 来自sdnlab】 开放网络没那么简单
链接:开放网络没那么简单 本文是云杉网络工程师张攀对当前开源网络技术现状的一些思考和探索. 开放网元.释放数据的价值 从2012年开始至今,网络行业明显是O字辈的天下.所有我接触过了解过的组织和项目, ...
- codeforces 377A. Puzzles 水题
A. Puzzles Time Limit: 20 Sec Memory Limit: 256 MB 题目连接 http://codeforces.com/problemset/problem/33 ...
随机推荐
- 微信公众号发送告警Python脚本
调用该脚本,可以向微信公众号发生告警. #!/bin/env python #coding:utf-8 #Author: Hogan #Descript : 微信公众号发送告警脚本 import ur ...
- SpringBoot与jackson.databind兼容报错问题
SpringBoot与jackson.databind兼容报错问题 ———————————————— 1.SpringBoot版本V2.0.0其依赖的jackson-databind版本为V2.9.4 ...
- 为什么second是秒也是第二?
起源 早期在西方,一小时分为 60 分钟.后来,科学发达了.文明进步了,人们认为一分钟太粗放了.必须划分得更细致,于是就把一分钟划分成 60 等分.由于是对时间的第二次划分,就将新的 60 等分的“单 ...
- js 反斜杠 处理
var t = jsonstr.replace(/\\/g,"\\\\\\\\"); --\\ 表示 代码 输出 \' 单引号 \" 双引号 \& 和号 \\ 反 ...
- pluginManagement的坑
想用protobuf-maven-plugin插件,用了<pluginManagement/>标签包裹<plugin/>,就引不进来,去掉就可以引进来.需要研究下. <b ...
- new/delete和malloc/free区别与联系
1.基本概念 malloc/free (1).函数原型及说明 void *malloc(long NumBytes): 该函数分配了NumBytes个字节,并返回了指向这块内存的指针.如果分配失败,则 ...
- Node.js 几个重启工程的工具
pm2, forever, nodemon, supervisor 均可在 npm 查找相关资料和用法. 线上工程推荐 pm2 开发推荐 supervisor
- lombok效率神奇使用
Lombok效率神器 标签(空格分隔): Java Lombok简介及使用 Lombok 是一种 Java实用工具,可用来帮助开发人员消除Java的冗长,尤其是对于简单的Java对象(POJO), 它 ...
- 通过jedis连接redis单机成功,使用redis客户端可以连接集群,但使用JedisCluster连接redis集群一直报Could not get a resource from the pool
一,问题描述: (如题目)通过jedis连接redis单机成功,使用JedisCluster连接redis集群一直报Could not get a resource from the pool 但是使 ...
- 在ThinkPHP框架(5.0.24)下引入Ueditor并实现向七牛云对象存储上传图片同时将图片信息保存到MySQL数据库,同时实现lazyload懒加载
这是我花了很多天的时间才得以真正实现的一组需求. 文章后面有完整Demo的GitHub链接. 一. 需求描述 1. 应用是基于ThinkPHP5开发的: 2. 服务器环境是LNMP,PHP版本是7.2 ...