题目描述

一张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. Spring IOC MVC DI简单实现

    目录的大致情况:所有的类都会加进来. 1.首先先写基本的Controller Service ServiceImpl Controller Service ServiceImpl是用来验证下面写的框架 ...

  2. [VB.NET Tips]Select Case语句拾遗

    正常的Select 语句如下: Dim status As Integer = 5 Select Case status Case 0 Console.WriteLine("状态是:0&qu ...

  3. Django-中间件-csrf扩展请求伪造拦截中间件-Django Auth模块使用-效仿 django 中间件配置实现功能插拔式效果-09

    目录 昨日补充:将自己写的 login_auth 装饰装在 CBV 上 django 中间件 django 请求生命周期 ***** 默认中间件及其大概方法组成 中间件的执行顺序 自定义中间件探究不同 ...

  4. 《HelloGitHub》第 42 期

    兴趣是最好的老师,HelloGitHub 就是帮你找到兴趣! 简介 分享 GitHub 上有趣.入门级的开源项目. 这是一个面向编程新手.热爱编程.对开源社区感兴趣 人群的月刊,月刊的内容包括:各种编 ...

  5. Redis数据库安装与配置调试

    主要培养自我对Redis数据库安装能力, 并且进行个性化的数据库配置.掌握本实验的重点,即在于数据库的安装与启动参数的配置.同时,理解NOSQL数据库的体系结构. ①下载Redis安装包进行数据库平台 ...

  6. DeleteFile

    import java.io.IOException; import java.net.URI; import java.net.URISyntaxException; import org.apac ...

  7. SUSE Ceph 增加节点、减少节点、 删除OSD磁盘等操作 - Storage6

    一.测试环境描述 之前我们已快速部署好一套Ceph集群(3节点),现要测试在现有集群中在线方式增加节点 如下表中可以看到增加节点node004具体配置 主机名 Public网络 管理网络 集群网络 说 ...

  8. WebGL简易教程(六):第一个三维示例(使用模型视图投影变换)

    目录 1. 概述 2. 示例:绘制多个三角形 2.1. Triangle_MVPMatrix.html 2.2. Triangle_MVPMatrix.js 2.2.1. 数据加入Z值 2.2.2. ...

  9. Python多任务之线程

    多任务介绍 我们先来看一下没有多任务的程序 import time def sing(): for i in range(5): print("我喜欢唱") time.sleep( ...

  10. Java 学习笔记之 线程Priority

    线程Priority: 线程可以划分优先级,优先级较高的线程得到的CPU资源较多,也就是CPU优先执行优先级较高的线程对象中的任务. 设置线程优先级有助于帮助“线程规划器”确定在下一次选择哪个线程来优 ...