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 ...
随机推荐
- npm 和 cnpm 区别
来源:https ://blog.csdn.net/shelly1072/article/details/51524029 NPM介绍: 说明:NPM(节点包管理器)是的NodeJS的包管理器,用于节 ...
- IDEA mapping箭头要怎么样设置哈(Free MyBatis插件)
效果如下图: 当我们点击箭头的时候,会快速切换到我们相关联的类位置,就不用再像以前一样还要去找 而 Free MyBatis是一款让我们操作更加方便的插件,你值得拥有哦~~~ idea 选择 File ...
- linux安装配置Redis,Swoole扩展
我是使用的是lnmp环境(php5.6.3) 一.安装redis数据库(参考w3c手册) 下载地址:http://redis.io/download 本教程使用的最新文档版本为 2.8.17,下载并安 ...
- 2018山东省赛 H Dominoes ( 搜索 )
题目链接 题意 : 给出一个 n * m 的矩阵,用规格 1 * 2 的多米诺去填充,题目数据保证最后只有一个格子是空白的(即没有被多米诺骨牌覆盖),问你现在通过移动多米诺能够产生多少种不同的状态(空 ...
- SQL 行转列(列的值不规则的数目)
--创建一个临时表用来存储数据 create table #tmp_SNValue_Table (FieldName nvarchar(20), [Value] nvarchar(max)) inse ...
- CodeForces 1200D White Lines
cf题面 Time limit 1500 ms Memory limit 262144 kB 解题思路 官方题解 1200D - White Lines Let's consider a single ...
- 源码阅读-Kingfisher
最后更新:2018-01-16 使用教程: 官方的链接 使用 Kingfisher 处理网络图片的读取与缓存 1. 开始使用 桥接 KingFisher, 利用 KingfisherCompatibl ...
- maven 高级玩法
maven 高级玩法 标签(空格分隔): maven 实用技巧 Maven 提速 多线程 # 用 4 个线程构建,以及根据 CPU 核数每个核分配 1 个线程进行构建 $ mvn -T 4 clean ...
- Jar包方式运行web项目
使用Maven进行打包 在自己的电脑终端中进入到pom.xml文件的目录中执行maven打包.命令为: mvn clean package 1 成功的标志为上面显示BUILD SUCCESS成功打包 ...
- 说下Java堆空间结构,及常用的jvm内存分析命令和工具
Java堆空间结构图:http://www.cnblogs.com/SaraMoring/p/5713732.html JVM内存状况查看方法和分析工具: http://blog.csdn.net/n ...