Code: Select all
#include <cstdio>
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
int main(){
while(1){
int N, n;
scanf("%d %d", &N, &n);
if(!n && !N){
return 0;
}
int numLarge = 0;
int markedLarge = 0;
char Grid[N][N];
char grid[n][n];
vector< vector<int> > arr(N, vector<int>(N, 0));
for(int i = 0; i<N; i++){
for(int j = 0; j<N; j++){
scanf(" %c", &Grid[i][j]);
if(Grid[i][j] == '*'){
numLarge++;
}
}
}
for(int i = 0; i<n; i++){
for(int j = 0; j<n; j++){
scanf(" %c", &grid[i][j]);
}
}
// Try each point of Grid
for(int I = 0; I<N; I++){
for(int J = 0; J<N; J++){
// Fit small polymino
if(arr[I][J]){
continue;
}
bool fits = true;
for(int i = 0; i<n && fits; i++){
for(int j = 0; j<n && fits; j++){
if(grid[i][j] == '*'){
if(I+i < 0 || I+i>=N || J+j<0 || J+j>=N){
fits = false;
continue;
}
if(arr[I+i][J+j]){
fits = false;
continue;
}
if(Grid[I+i][J+j]!='*'){
fits = false;
}
}
}
}
// If it fits, save changes to arr: do above loop but mark arr
// Update markedLarge too
if(fits){
for(int i = 0; i<n; i++){
for(int j = 0; j<n; j++){
if(grid[i][j] == '*'){
arr[I+i][J+j] = 1;
markedLarge++;
}
}
}
}
}
}
// Compare large polymino to arr: each block must be 1 on arr
// Or actually just count
/*for(int i = 0; i<N; i++){
for(int j = 0; j<N; j++){
printf("%d ", arr[i][j]);
}
printf("\n");
}*/
if(numLarge == markedLarge){
printf("1\n");
} else {
printf("0\n");
}
}
return 0;
}