这是一道比较水的题,只要理解了题意就行了。
题意:给你一个原有的图1,‘*’表示1,'.'表示空,再给你一个图2,现在让你用2个图2来填充图1,不能旋转和覆盖。如果可以就输出1,不行就输出0;
思路:将图2的点距离第一个“*”的x和y的距离算出来,保存在数组num_x和num_y中。然后循环两次,最后判断是否还有就行了。
代码:
#include<iostream>
#include<cmath>
#include<cstring>
#include<cstdio>
#include<algorithm>
#include<cstdlib>
using namespace std;
char str1[16][16];
char str2[16][16];
int num1[16][16];
int num_x[110];
int num_y[110];
int n,m;
int k=0;
int check() {
for(int i=0; i<n; i++) {
for(int j=0; j<n; j++) {
if(num1[i][j]==1) {
return 0;
}
}
}
return 1;
}
int solve() {
for(int s=0; s<2; s++) {
for(int i=0; i<n; i++) {
for(int j=0; j<n; j++) {
if(num1[i][j]==1) {
for(int t=0; t<k; t++) {
if(num1[i+num_x[t]][j+num_y[t]]==1) {
num1[i+num_x[t]][j+num_y[t]]=0;
} else {
return 0;
}
}
}
}
}
}
return check();
}
int main() {
while(cin>>n>>m) {
if(n==0&&m==0) {
break;
}
for(int i=0; i<n; i++) {
cin>>str1[i];
}
memset(num1,0,sizeof(num1));
for(int i=0; i<n; i++) {
for(int j=0; j<n; j++) {
if(str1[i][j]=='*') {
num1[i][j]=1;
}
}
}
for(int i=0; i<m; i++) {
cin>>str2[i];
}
int flagi=0;
int flagj=0;
int flag=0;
for(int i=0; i<m; i++) {
for(int j=0; j<m; j++) {
if(str2[i][j]=='*') {
flagi=i;
flagj=j;
flag=1;
break;
}
}
if(flag) {
break;
}
}
num_x[0]=0;
num_y[0]=0;
k=1;
for(int i=flagi; i<m; i++) {
for(int j=0; j<m; j++) {
if(i==flagi&&j==flagj) {
continue;
}
if(str2[i][j]=='*') {
num_x[k]=i-flagi;
num_y[k++]=j-flagj;
}
}
}
int s=solve();
if(s) {
printf("1\n");
} else {
printf("0\n");
}
}
return 0;
}