题目描述

一张n*m的方格纸,有些格子需要印成黑色,剩下的格子需要保留白色。你有一个a*b的印章,有些格子是凸起(会沾上墨水)的。你需要判断能否用这个印章印出纸上的图案。印的过程中需要满足以下要求:(1)印章不可以旋转。(2)不能把墨水印到纸外面。(3)纸上的同一个格子不可以印多次。

输入输出格式

输入格式:

第一行一个整数q(1<=q<=10),表示测试点数量。接下来q个测试点,每个测试点中:第一行包含4个整数n,m,a,b(1<=n,m,a,b<=1000)。接下来n行,每行m个字符,描述纸上的图案。'.'表示留白,'x'表示需要染黑。接下来a行,每行b个字符,描述印章。'.'表示不沾墨水,'x'表示沾墨水。

输出格式:

对于每个测试点,输出TAK(是)或NIE(否)。

输入输出样例

输入样例#1:

2
3 4 4 2
xx..
.xx.
xx..
x.
.x
x.
..
2 2 2 2
xx
xx
.x
x.
输出样例#1:

TAK
NIE

说明

一张n*m的方格纸,有些格子需要印成黑色,剩下的格子需要保留白色。

你有一个a*b的印章,有些格子是凸起(会沾上墨水)的。你需要判断能否用这个印章印出纸上的图案。印的过程中需要满足以下要求:

(1)印章不可以旋转。

(2)不能把墨水印到纸外面。

(3)纸上的同一个格子不可以印多次。

提交地址 : Luogu3585;

模拟水题;

调了半天(真是半天);

首先,我们肯定要把印章的左上角第一个有印的地方,对准画布上第一个左上角地方;

显然可以暴力O(n^4), T飞;

#include <iostream>
#include <cstdio>
#include <algorithm>
#include <cstring>
using namespace std; inline char nc()
{
static const int BS = << ;
static unsigned char buf[BS],*st,*ed;
if(st == ed) ed = buf + fread(st=buf,,BS,stdin);
return st == ed ? EOF : *st++;
}
//#define getchar nc
inline int read()
{
int res=;bool flag=;char ch=getchar();
while(!isdigit(ch)){if(ch=='-')flag=;ch=getchar();
}while(isdigit(ch)){res=(res<<)+(res<<)+(ch-'');ch=getchar();
}return flag?-res:res;
} int q;
int n, m, x, y;
int a[][];
int tab[][];
int num, fx, fy; bool check(int xx, int yy)
{
xx -= fx - , yy -= fy - ;
for (register int i = ; i <= x ; i ++)
{
for (register int j = ; j <= y ; j ++)
{
if (tab[i][j] == ) continue;
if (xx + i - <= or xx + i - > n or yy + j - <= or yy + j - > m or a[xx+i-][yy+j-] == ) return ;
a[xx+i-][yy+j-] = ;
num--;
}
}
return ;
} int main()
{
q = read();
while (q--)
{
num=;
n=read(), m=read(), x=read(), y=read();
fx = fy = ;
for (register int i = ; i <= n ; i ++)
{
for (register int j = ; j <= m ; j ++)
{
char ch;
cin >> ch;
if (ch == '.') a[i][j] = ;
else a[i][j] = , num++;
}
}
for (register int i = ; i <= x ; i ++)
{
for (register int j = ; j <= y ; j ++)
{
char ch;
cin >> ch;
if (ch == '.') tab[i][j] = ;
else
{
tab[i][j] = ;
if (!fx) fx = i, fy = j;
}
}
} for (register int i = ; i <= n ; i ++)
{
for (register int j = ; j <= m ; j ++)
{
if (!a[i][j]) continue;
if (!check(i, j))
{
puts("NIE");
goto End;
}
if (num == )
{
puts("TAK");
goto End;
}
}
}
puts("NIE");
End:;
}
return ;
}

zZhBr

现在我们考虑优化;

我们把时间主要浪费在哪里了?

不停地循环找印章!

显然我们在印章和图里有很多不需要的点, 我们花费了太多时间浪费在它们身上;

那不如干脆来一个链表,直接把有用的点穿起来,这样查询十分省时间!

轻松A掉

 #include <iostream>
#include <cstdio>
#include <algorithm>
#include <cstring>
using namespace std; inline char nc()
{
static const int BS = << ;
static unsigned char buf[BS],*st,*ed;
if(st == ed) ed = buf + fread(st=buf,,BS,stdin);
return st == ed ? EOF : *st++;
}
#define nc getchar
inline int read()
{
int res=;bool flag=;char ch=nc();
while(!isdigit(ch)){if(ch=='-')flag=;ch=nc();
}while(isdigit(ch)){res=(res<<)+(res<<)+(ch-'');ch=nc();
}return flag?-res:res;
} int q;
int n, m, x, y;
struct MAP
{
int x, y;
}a[*];
int cnt = ;
struct TAB
{
int x, y;
}tab[*];
int now = ;
int mp[][]; inline bool check(int xx, int yy)
{
xx -= tab[].x - , yy -= tab[].y - ;
for (register int i = ; i <= now ; i ++)
{
int tx = xx + tab[i].x - , ty = yy + tab[i].y - ;
if (tx <= or tx > n or ty <= or ty > m) return ;
if (mp[tx][ty] == ) return ;
mp[tx][ty] = ;
}
return ;
} int main()
{
q = read();
while (q--)
{
n=read(), m=read(), x=read(), y=read();
cnt = now = ;
for (register int i = ; i <= n ; i ++)
{
for (register int j = ; j <= m ; j ++)
{
char ch;
cin >> ch;
if (ch == '.') mp[i][j] = ;
else
{
mp[i][j] = ;
a[cnt].x = i;
a[cnt++].y = j;
}
}
}
for (register int i = ; i <= x ; i ++)
{
for (register int j = ; j <= y ; j ++)
{
char ch;
cin >> ch;
if (ch == '.') continue;
else
{
tab[now].x = i;
tab[now++].y = j;
}
}
}
cnt--, now--;
for (register int i = ; i <= cnt ; i ++)
{
if (mp[a[i].x][a[i].y] == ) continue;
if (!check(a[i].x, a[i].y))
{
puts("NIE");
goto End;
}
} puts("TAK");
End:;
}
return ;
}

[POI2015]PIE的更多相关文章

  1. 洛谷 P3585 [POI2015]PIE

    P3585 [POI2015]PIE 题目描述 一张n*m的方格纸,有些格子需要印成黑色,剩下的格子需要保留白色.你有一个a*b的印章,有些格子是凸起(会沾上墨水)的.你需要判断能否用这个印章印出纸上 ...

  2. 洛谷P3585 [POI2015]PIE

    传送门 题目大意:有个n*m的格子图,要求'x'点要被染成黑色 有个a*b的印章,'x'是可以染色的印章上的点. 要求用印章去染色格子 (1)印章不可以旋转. (2)不能把墨水印到纸外面. (3)纸上 ...

  3. POI2015 解题报告

    由于博主没有BZOJ权限号, 是在洛咕做的题~ 完成了13题(虽然有一半难题都是看题解的QAQ)剩下的题咕咕咕~~ Luogu3585 [POI2015]PIE Solution 模拟, 按顺序搜索, ...

  4. POI 2018.10.20

    [POI2005]BANK-Cash Dispenser 有多少个4位字符串是所有操作序列的子串. 10^4枚举字符串.暴力判断会TLE 发现,我们就是在每个操作序列中不断找第一个出现的c字符. 预处 ...

  5. 10月清北学堂培训 Day 6

    今天是黄致焕老师的讲授~ T1 自信 AC 莫名 80 pts???我还是太菜了!! 对于每种颜色求出该颜色的四个边界,之后枚举边界构成的矩阵中每个元素,如果不等于该颜色就标记那种颜色不能最先使用. ...

  6. 【题解】PIE [POI2015] [P3585]

    [题解]\(PIE\) \([POI2015]\) \([P3585]\) 逼自己每天一道模拟题 传送门:\(PIE\) \([POI2015]\) \([P3585]\) [题目描述] 一张 \(n ...

  7. [No0000A2]“原始印欧语”(PIE)听起来是什么样子?

    "Faux Amis"节目中经常提到"原始印欧语"(PIE)——"Proto-Indo-European". 我们说过,英语,法语中的&qu ...

  8. poj3311 Hie with the Pie (状态压缩dp,旅行商)

    Hie with the Pie Time Limit: 2000MS   Memory Limit: 65536K Total Submissions: 3160   Accepted: 1613 ...

  9. pygame 练习之 PIE game (以及简单图形训练)

    简单的大饼游戏,掌握pygame中直线以及圆弧的画法,以及对输入的响应. import math import pygame, sys from pygame.locals import * pyga ...

随机推荐

  1. gh-ost 原理剖析

    gh-ost 原理 一 简介 上一篇文章介绍 gh-ost 参数和具体的使用方法,以及核心特性-可动态调整 暂停,动态修改参数等等.本文分几部分从源码方面解释gh-ost的执行过程,数据迁移,切换细节 ...

  2. JS 防抖和节流

    防抖和节流 在处理高频事件,类似于window的resize或者scorll,或者input输入校验等操作时.如果直接执行事件处理器,会增大浏览器的负担,严重的直接卡死,用户体验非常不好. 面对这种情 ...

  3. SpringCloud(五)Zuul网关与分布式配置中心

    在 Spring Cloud 微服务系统中,一种常见的负载均衡方式是,客户端的请求首先经过负载均衡(Ngnix),再到达服务网关(Zuul 集群),然后再到具体的服务.服务统一注册到高可用的服务注册中 ...

  4. 浅谈Task的用法

    Task是用来实现多线程的类,在以前当版本中已经有了Thread及ThreadPool,为什么还要提出Task类呢,这是因为直接操作Thread及ThreadPool,向线程中传递参数,获取线程的返回 ...

  5. 【数据结构与算法】--JavaScript 链表

    一.介绍 JavaScript 原生提供了数组类型,但是却没有链表,虽然平常的业务开发中,数组是可以满足基本需求,但是链表在大数据集操作等特定的场景下明显具有优势,那为何 JavaScript 不提供 ...

  6. SpringBoot系列——ElasticSearch

    前言 本文记录安装配置ES环境,在SpringBoot项目中使用SpringData-ElasticSearch对ES进行增删改查通用操作 ElasticSearch官网:https://www.el ...

  7. impala对元数据的界面更新操作

    执行 impala-shell 即能进入界面操作sql.如果在hive更新了数据之后,而在impala中却无法看到更新后的数据的话,意味着impala里元数据信息还没有刷新,此时在impala操作界面 ...

  8. Proxy实现java动态代理

    在java设计模式中代理模式的应用比较广泛, 比如我在编写一写web程序时在filter修改request或response时, 而request中并没有相应的set方法, 这样要做到修改就需要使用一 ...

  9. js 判断字符串是否存在某个字符串

    可使用String和Regexp对象的相关方法进行处理,如下 一.String对象方法 1.使用indexOf()方法,返回某个指定的字符串值在字符串中首次出现的位置.如果要检索的字符串值没有出现,则 ...

  10. Scanner类的next()方法和nextLine()方法的异同点

    通过一段代码就可以明白其中的奥妙!! import java.util.Scanner; public class next_nextLine { public static void main(St ...