列表

详情


NC219031. 匹配矩阵

描述

两个矩阵一大一小,找一找小的矩阵在大的01矩阵中出现了几次。为了增加趣味性,若小矩阵中某个位置的元素为,那在和大矩阵的局部做匹配的时候,该位置不做要求。

注:当小矩阵分别旋转0,90,180,270度都有符合的时候皆属于不同的状况


输入描述

第一行一个正整数 表示测试数据的组数

每组测试数据第一行有两个整数  表示大矩阵的长与宽

接下来给出一个列的矩阵

下一行有两个整数  表示小矩阵的长与宽

接下来给出一个列的矩阵

大矩阵只由两种数字组成,小矩阵由三种组成

输出描述

每组测试数据输出一行,表示能够匹配的区域数

示例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;
}

上一题