【大连民族大学C语言CG题库练习题】——判断一个矩阵是另一个矩阵的子矩阵

【问题描述】

从标准输入中输入一个N(N<=9)阶矩阵和一个M(M<=N)阶矩阵,判断矩阵M是否是N的子矩阵,若是则输出M在N中的起始位置,若不是则输出-1。若矩阵M能与N中某一区域完全相等,则称M是N的子矩阵。

【输入形式】

从标准输入读取矩阵。

第一行只有一个整数N,代表第一个矩阵的阶数。后续有N行输入,每行有N个以若干空格分隔的整数,代表该矩阵在该行上的所有元素。

输入完N阶矩阵后,再在下一行输入一个整数M,代表第二个矩阵的阶数。后续有M行输入,每行有M个以若干空格分隔的整数,代表该矩阵在该行上的所有元素。

【输出形式】

输出M在N中的起始位置,即N中的第几行第几列,两个数字用逗号","分隔(从第1行第1列开始计数,即:矩阵第一个元素的位置为:1,1。

若N有多个子矩阵与M矩阵完全相同,则输出首先找到的起始位置,即行最小的位置,若行相同,则为列最小的位置。

若M不是N的子矩阵,则输出-1。

【样例输入】

6

3 9 15 25 -9 0

36 102 2 5 67 89

8 12 58 6 53 456

67 7 895 -12 65 -83

-56 812 25 0 72 61

4 71 69 -4 341 970

3

6 53 456

-12 65 -83

0 72 61

【样例输出】

3,4

【样例说明】

第一个矩阵为6阶矩阵,第二个矩阵为3阶矩阵,第二个矩阵与第一个矩阵的某个子矩阵(起始位置为第3行第4列的3阶矩阵)完全相同,故输出3,4,行列数用逗号隔开。

【评分标准】

该题要求输出M矩阵在N矩阵的起始位置。上传C语言文件名为example2b.c。

复制代码
#include <stdio.h>
int main()
{
	int n;
	scanf("%d",&n);
	int a[n][n];
	int i,j;
	for(i=0;i<n;i++)
	{
		for(j=0;j<n;j++)
		{
			scanf("%d",&a[i][j]);
		}
	}
	int m;
	scanf("%d",&m);
	int b[m][m];
	for(i=0;i<m;i++)
	{
		for(j=0;j<m;j++)
		{
			scanf("%d",&b[i][j]);
		}
	}
	int p,q;
	int res=0;
	int flag=m*m;
	int len=0;
	int mark[100][2];
	for(p=0;p<n-m+1;p++)
	{
		for(q=0;q<n-m+1;q++)
		{
			len=0;
			for(i=p;i<p+m;i++)
			{
				for(j=q;j<q+m;j++)
				{
					if(a[i][j]==b[i-p][j-q])
					{
						len++;
//						printf("%d %d=%d %d\n",i,j,i-p,j-p);
					}
				}
			}
//			printf("%d\n",len);
			if(len==flag)
			{
				mark[res][0]=p;
				mark[res][1]=q;
				res++;
			}
		}
	}
	if(res==0)
	{
		printf("-1");
		return 0;
	}
	int temp;
	for(i=1;i<res;i++)
	{
		for(j=0;j<res-i;j++)
		{
			if(mark[j][0]<mark[j+1][0])
			{
				temp=mark[j][0];
				mark[j][0]=mark[j+1][0];
				mark[j+1][0]=temp;
			}
		}
	}
	for(i=1;i<res;i++)
	{
		for(j=0;j<res-i;j++)
		{
			if(mark[j][1]<mark[j+1][1])
			{
				temp=mark[j][1];
				mark[j][1]=mark[j+1][1];
				mark[j+1][1]=temp;
			}
		}
	}
	printf("%d,%d",mark[0][0]+1,mark[0][1]+1);
	return 0;
}

但是我的代码存在边界的问题,以下样例无法通过,欢迎大佬改正指教

期望输入

2
5 5
6 6
1
6

期望输出

2,1

我的输出

2,2

相关推荐
渡之2 分钟前
GRiM-Net 深度解析 | 无人机 GNSS 拒止场景下两阶段跨视角视觉定位框架
深度学习·算法·动态规划·无人机
测试仪器廖生1359025638521 分钟前
罗德与施瓦茨 FSP13频谱分析仪FSP30
网络·人工智能·算法
happymaker062624 分钟前
LeetCodeHot100——560.和为K的子数组
算法
dtq042441 分钟前
C语言刷题数组5,6(求平均值,求最大值)
c语言·数据结构·算法
郭梧悠1 小时前
Hash算法入门Hash冲突解决方案
算法·哈希算法
洛水水1 小时前
【力扣100题】81.寻找两个正序数组的中位数
数据结构·算法·leetcode
happymaker06262 小时前
LeetCodeHot100——155.最小栈
算法
洛水水2 小时前
【力扣100题】85.每日温度
算法·leetcode·职场和发展
Coder-magician2 小时前
《代码随想录》刷题打卡day15:二叉树part05
数据结构·c++·算法
Kurisu_红莉栖2 小时前
力扣56合并区间
算法·leetcode