NBUT 1105  多连块拼图

Time Limit:1000MS     Memory Limit:65535KB     64bit IO Format:

Appoint description: 
System Crawler  (Aug 12, 2016 9:32:14 AM)

Description

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

-- 维基百科

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

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
/*/
中文题: 模拟题,模拟去用n个完全相同小块覆盖大块。 仔细想一下啊,用小块能够覆盖掉大块的话有且只有一种覆盖方式,而且大块某个点只能由小块的某点覆盖。 这样就简单了,我的做法用,先找从速往下到小块的第一个*号,然后DFS搜一下整个小块的以第一个*为【0,0】的所有坐标。 然后到大块里面去找,从上往下找到第一个*,把小块的每一个坐标覆盖过的位 置全部该成 ‘.’ 记录下一共改了多少个点【前面记录大块一共有多少个点】。 如果相同就说明成功覆盖,否则不能。 AC代码
/*/
#include"algorithm"
#include"iostream"
#include"cstring"
#include"cstdlib"
#include"cstdio"
#include"string"
#include"vector"
#include"queue"
#include"cmath"
#include"map"
using namespace std;
typedef long long LL ;
#define memset(x,y) memset(x,y,sizeof(x))
#define memcpy(x,y) memcpy(x,y,sizeof(x))
#define FK(x) cout<<"["<<x<<"]\n"
#define bigfor(T) for(int qq=1;qq<= T ;qq++)
#define lson l,m,rt<<1
#define rson m+1,r,rt<<1|1 struct Box {
int x,y;
Box(int xx,int yy):x(xx),y(yy) {};
Box() {};
} into[123]; int n,m;
int num2,num;
int erear;
char maps[20][20],box[20][20],sox[20][20],vis[20][20];
int dir[4][2]= {{0,1},{1,0},{-1,0},{0,-1}}; void init() {
erear=0;
memset(vis,0);
}
void DFS(int x,int y,int tox,int toy) {
if(!vis[x][y]) {
vis[x][y]=1;
into[erear++]=Box(tox,toy);//记录box的覆盖坐标
for(int i=0; i<4; i++) {
int xx=x+dir[i][0];
int yy=y+dir[i][1];
if(xx<0||yy<0||xx>=m||yy>=m)continue;
if(box[xx][yy]!='*')continue;
if(vis[xx][yy])continue;
DFS(xx,yy,tox+dir[i][0],toy+dir[i][1]);
}
}
} int main() {
while(~scanf("%d%d",&n,&m)) {
if(!n&&!m)break;
num=0;
num2=0;
for(int i=0; i<n; i++) {
scanf("%s",maps[i]);
for(int j=0; j<n; j++) {
if(maps[i][j]=='*')num++;
}
}
for(int i=0; i<m; i++) {
scanf("%s",box[i]);
for(int j=0; j<m; j++) {
if(box[i][j]=='*')num2++;
}
}
if(num%num2) {
puts("0");
continue;
}
int stx,sty;
int flag=1;
init();
for(int i=0; i<m; i++) {
for(int j=0; j<m; j++) {
if(box[i][j]=='*') {
DFS(i,j,0,0);
flag=0;
}
if(!flag)break;
}
if(!flag)break;
} // for(int i=0;i<erear;i++){
// cout<<"x "<<into[i].x<<" y "<<into[i].y<<endl;
// } int tot=0;
flag=0;
for(int i=0; i<n; i++) {
for(int j=0; j<n; j++) {
if(maps[i][j]=='*') {
for(int k=0; k<erear; k++) {
if(maps[i+into[k].x][j+into[k].y]!='*') {//模拟覆盖。
flag=1;
break;
}
maps[i+into[k].x][j+into[k].y]='.';
tot++;
}
if(flag)break;
}
if(flag)break;
}
}
// puts("");
// for(int i=0;i<n;i++){
// puts(maps[i]);
// }
// puts("");
if(tot==num)puts("1");
else puts("0");
}
return 0;
}

  

 

ACM: NBUT 1105 多连块拼图 - 水题 - 模拟的更多相关文章

  1. CodeForces 686A Free Ice Cream (水题模拟)

    题意:给定初始数量的冰激凌,然后n个操作,如果是“+”,那么数量就会增加,如果是“-”,如果现有的数量大于等于要减的数量,那么就减掉,如果小于, 那么孩子就会离家.问你最后剩下多少冰激凌,和出走的孩子 ...

  2. CodeFroces--Good Bye 2016-B--New Year and North Pole(水题-模拟)

    B. New Year and North Pole time limit per test 2 seconds memory limit per test 256 megabytes input s ...

  3. CodeFroces--Good Bye 2016-A-New Year and Hurry(水题-模拟)

    A. New Year and Hurry time limit per test 1 second memory limit per test 256 megabytes input standar ...

  4. CodeForces 339B Xenia and Ringroad(水题模拟)

    题意:给定 n 个地方,然后再给 m 个任务,每个任务必须在规定的地方完成,并且必须按顺序完成,问你最少时间. 析:没什么可说的,就是模拟,记录当前的位置,然后去找和下一个位置相差多长时间,然后更新当 ...

  5. CodeForces 342B Xenia and Spies (水题模拟,贪心)

    题意:给定 n 个间谍,m个区间,一个 s,一个f,然后从 s开始传纸条,然后传到 f,然后在每个 t 时间在区间内的不能传,问你最少的时间传过去. 析:这个题,就模拟一下就好,贪心策略,能传就传,找 ...

  6. CodeForces 723B Text Document Analysis (水题模拟)

    题意:给定一行字符串,让你统计在括号外最长的单词和在括号内的单词数. 析:直接模拟,注意一下在左右括号的时候有没有单词.碰到下划线或者括号表示单词结束了. 代码如下: #pragma comment( ...

  7. CodeForces 731B Coupons and Discounts (水题模拟)

    题意:有n个队参加CCPC,然后有两种优惠方式,一种是一天买再次,一种是买两天,现在让你判断能不能找到一种方式,使得优惠不剩余. 析:直接模拟,如果本次是奇数,那么就得用第二种,作一个标记,再去计算下 ...

  8. 洛谷P1426 小鱼会有危险吗【水题模拟】

    有一次,小鱼要从A处沿直线往右边游,小鱼第一秒可以游7米,从第二秒开始每秒游的距离只有前一秒的98%.有个极其邪恶的猎人在距离A处右边s米的地方,安装了一个隐蔽的探测器,探测器左右x米之内是探测范围. ...

  9. 洛谷P1540 机器翻译 水题 模拟

    注意一下细节,尤其是更新minv时不要更新错. Code: #include<vector> #include<iostream> #include<cstdio> ...

随机推荐

  1. java高级特性

    第二章 XML(可扩展标记语言) XML格式能够表达层次结构,并且重复的元素不会被曲解. 与HTML不同,XML是大小写敏感的. 必须有结束符. 属性值必须用引号括起来. 所有属性必须都有属性值. X ...

  2. linuxmint 17安装scim输入法

    安装输入法框架: sudo apt-get install scim 安装输入法: sodu apt-get install scim-pinyin 此时启动的输入法的候选词框不随着光标移动,需要安装 ...

  3. [Python] 学习资料汇总

    Python是一种面向对象的解释性的计算机程序设计语言,也是一种功能强大且完善的通用型语言,已经有十多年的发展历史,成熟且稳定.Python 具有脚本语言中最丰富和强大的类库,足以支持绝大多数日常应用 ...

  4. Tortoise SVN 版本控制常用操作汇总(show log)

    1.如何查看SVN上当前代码库的最新版本号是多少? 打开右键菜单中的 show log,然后看到一系列版本更新历史,最上面的那一行,即是最新版本号,所谓的 head revision. 2.如何查看本 ...

  5. 《征服 C 指针》笔记6:练习——挑战那些复杂的声明

    应该是小试牛刀的时候了. 在 ANSI C 的标准库中,有一个 atexit()函数.如果使用这个函数,当程序正常结束的时候,可以回调一个指定的函数. atexit()的原型定义如下: int ate ...

  6. CSS3 @media 查询

    @media 可以针对不同的屏幕尺寸设置不同的样式,特别是如果你需要设置设计响应式的页面,@media 是非常有用的. 媒体查询包含了一个媒体类型和CSS3规范中描述的包含一个或多个表达式的媒体属性, ...

  7. I18N 国际化

    http://blog.sina.com.cn/s/blog_6c7e59770101p7w9.html 一.I18N 在 J2EE 中的应用 [转载:http://blog.csdn.net/cha ...

  8. 【Python基础学习五】列表,元祖,字典

    1.列表(list) 列表是Python的一种内置数据类型,list是一种有序的集合,可以随时添加和删除其中的元素,就像动态数组一样.获取list中的元素用角标获取,角标可以使用正角标,也可以使用负角 ...

  9. java程序打包成jar

    1. 建立文件夹:proj,在该文件夹下建立3个子文件夹:lib,src 2. 在lib文件夹中放置依赖的jar包 3. 在src中放置类文件:com.cnjava.demo.Main.java 4. ...

  10. Effective C++ -----条款54:让自己熟悉包括TR1在内的标准程序库

    C++ 标准程序库的主要机能由STL.iostream.locales 组成.并包含C99 标准程序库. TR1 添加了只能指针(例如 tr1::shared_ptr).一般化函数指针(tr1::fu ...