标签:
Description
一张n*m的方格纸,有些格子需要印成黑色,剩下的格子需要保留白色。
你有一个a*b的印章,有些格子是凸起(会沾上墨水)的。你需要判断能否用这个印章印出纸上的图案。印的过程中需要满足以下要求:
(1)印章不可以旋转。
(2)不能把墨水印到纸外面。
(3)纸上的同一个格子不可以印多次。
Input
第一行一个整数q(1<=q<=10),表示测试点数量。
接下来q个测试点,每个测试点中:
第一行包含4个整数n,m,a,b(1<=n,m,a,b<=1000)。
接下来n行,每行m个字符,描述纸上的图案。‘.‘表示留白,‘x‘表示需要染黑。
接下来a行,每行b个字符,描述印章。‘.‘表示不沾墨水,‘x‘表示沾墨水。
Output
对于每个测试点,输出TAK(是)或NIE(否)。
Sample Input
2
3 4 4 2
xx..
.xx.
xx..
x.
.x
x.
..
2 2 2 2
xx
xx
.x
x.
Sample Output
TAK
NIE
因为不能转动,所以纪录相对位置进行模拟。
1 #include<stdio.h> 2 #include<string.h> 3 char s[1100][1100], r[1100]; 4 int sx[1001*1001], sy[1001*1001], vis[1100][1100]; 5 6 int main() 7 { 8 9 int T, n, m, x, y; 10 scanf("%d", &T); 11 while (T--) 12 { 13 bool flag = false; 14 int tot = 0; 15 scanf("%d %d", &n, &m); 16 scanf("%d %d", &x, &y); 17 for (int i = 0; i < n; i++) 18 { 19 scanf("%s", s[i]); 20 } 21 int p1 = -1;int p2 = -1; 22 for (int i = 0; i < x; i++){ 23 scanf("%s", r); 24 for (int j = 0; j < y; j++){ 25 if (r[j] == ‘x‘){ 26 if (p1 == -1){ 27 p1 = i;p2 = j; 28 } 29 else{ 30 sx[++tot] = i - p1; 31 sy[tot] = j - p2; 32 } 33 } 34 } 35 } 36 memset(vis, 0 , sizeof(vis)); 37 if(p1==-1){ 38 printf("NIE\n");continue; 39 } 40 for (int i = 0; i < n ; i++) 41 { 42 for (int j = 0; j < m; j++) 43 { 44 if (s[i][j] == ‘.‘||vis[i][j])continue; 45 vis[i][j] = 1; 46 for (int k = 1; k <= tot; k++) 47 { 48 if ((i+sx[k]<0)||(i+sx[k])>=n||(j+sy[k]<0)||(j+sy[k]>=m)||vis[i+sx[k]][j+sy[k]]||s[i+sx[k]][j+sy[k]]==‘.‘) 49 { 50 flag = true; 51 break; 52 } 53 vis[i+sx[k]][j+sy[k]] = 1; 54 } 55 } 56 if (flag)break; 57 } 58 if (flag)printf("NIE\n"); 59 else printf("TAK\n"); 60 } 61 62 }
标签:
原文地址:http://www.cnblogs.com/z52527/p/4594406.html