NC219031. 匹配矩阵
描述
输入描述
第一行一个正整数
表示测试数据的组数
每组测试数据第一行有两个整数
表示大
矩阵的长与宽
接下来给出一个
行
列的
矩阵
下一行有两个整数
表示小
矩阵的长与宽
接下来给出一个
行
列的
矩阵
大矩阵只由
两种数字组成,小矩阵由
三种组成
输出描述
每组测试数据输出一行,表示能够匹配的区域数
示例1
输入:
2 5 5 01010 10111 01011 01111 10111 2 3 11# 111 2 2 00 00 2 2 00 00
输出:
9 4
C 解法, 执行用时: 3ms, 内存消耗: 372K, 提交时间: 2021-05-19 16:11:52
#include<stdio.h> char a[25][25]; char b[5][25][25]; int main() { int i,j,k,l,n,m,m1,n1,sum,t,i1,j1,l1; scanf("%d",&t); while(t--){ sum=0; scanf("%d%d",&n,&m); getchar(); for(i=1;i<=n;i++){ for(j=1;j<=m;j++)scanf("%c",&a[i][j]);getchar();} scanf("%d%d",&n1,&m1); getchar(); for(i=1;i<=n1;i++){ for(j=1;j<=m1;j++){//求出四种状态 scanf("%c",&b[1][i][j]); b[2][j][n1+1-i]=b[1][i][j]; b[3][n1+1-i][m1+1-j]=b[1][i][j]; b[4][m1+1-j][i]=b[1][i][j]; } getchar();} for(i=n1;i<=n;i++) for(j=m1;j<=m;j++){ l1=j-m1;l=i-n1; for(i1=i;i1>i-n1;i1--){ for(j1=j;j1>j-m1;j1--) if(b[1][i1-l][j1-l1]!=a[i1][j1]&&b[1][i1-l][j1-l1]!='#')break; if(j1!=j-m1)break; } if(i1==i-n1) sum++; } for(i=n1;i<=n;i++) for(j=m1;j<=m;j++){ l1=j-m1;l=i-n1; for(i1=i;i1>i-n1;i1--){ for(j1=j;j1>j-m1;j1--) if(b[3][i1-l][j1-l1]!=a[i1][j1]&&b[3][i1-l][j1-l1]!='#')break; if(j1!=j-m1)break; } if(i1==i-n1)sum++; } for(i=m1;i<=n;i++) for(j=n1;j<=m;j++){ l1=j-n1;l=i-m1; for(i1=i;i1>i-m1;i1--){ for(j1=j;j1>j-n1;j1--) if(b[2][i1-l][j1-l1]!=a[i1][j1]&&b[2][i1-l][j1-l1]!='#')break; if(j1!=j-n1)break; } if(i1==i-m1)sum++; } for(i=m1;i<=n;i++) for(j=n1;j<=m;j++){ l1=j-n1;l=i-m1; for(i1=i;i1>i-m1;i1--){ for(j1=j;j1>j-n1;j1--) if(b[4][i1-l][j1-l1]!=a[i1][j1]&&b[4][i1-l][j1-l1]!='#')break; if(j1!=j-n1)break; } if(i1==i-m1)sum++; } printf("%d\n",sum); } }
C++(clang++11) 解法, 执行用时: 4ms, 内存消耗: 504K, 提交时间: 2021-03-26 11:51:13
#include<bits/stdc++.h> using namespace std; int n1,m1,n2,m2; char a[25][25]; int get(char b[25][25],int n2,int m2) { int i,j,k,l,ans=0; for(i=0;i+n2-1<n1;i++) { for(j=0;j+m2-1<m1;j++) { bool flag=1; for(k=0;flag&&k<n2;k++) for(l=0;flag&&l<m2;l++)if(b[k][l]!='#'&&b[k][l]!=a[i+k][j+l])flag=0; ans+=flag; } } return ans; } int main() { int i,j,ans,T; char b[25][25],c[25][25],d[25][25],e[25][25]; scanf("%d",&T); while(T--) { scanf("%d%d",&n1,&m1),ans=0; for(i=0;i<n1;i++)scanf("%s",a[i]); scanf("%d%d",&n2,&m2); for(i=0;i<n2;i++)scanf("%s",b[i]); ans+=get(b,n2,m2); for(i=0;i<n2;i++) for(j=0;j<m2;j++) c[j][n2-i-1]=b[i][j]; ans+=get(c,m2,n2); for(i=0;i<n2;i++) for(j=0;j<m2;j++) d[n2-i-1][m2-j-1]=b[i][j]; ans+=get(d,n2,m2); for(i=0;i<n2;i++) for(j=0;j<m2;j++) e[m2-j-1][i]=b[i][j]; ans+=get(e,m2,n2); printf("%d\n",ans); } return 0; }