【大连民族大学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

相关推荐
linx295几秒前
单元九 · 零基础路线图-第 7–9 周·类与 RAII
c语言·开发语言·数据结构·c++·嵌入式硬件·算法
布莱克6053 分钟前
C++ 七大排序算法详解:选择、冒泡、插入、计数、堆、快速与归并排序
数据结构·c++·算法·排序算法
shehuiyuelaiyuehao44 分钟前
算法44,模拟算法,数青蛙
算法·哈希算法·散列表
hanlin031 小时前
刷题笔记:力扣第287题-寻找重复数
笔记·算法·leetcode
kevin_kang1 小时前
第02章 对话时间线与延迟分析
算法
科学实验家1 小时前
最小生成树:Prim,kruskal
数据结构·c++·算法
学习智者1 小时前
《玄》IDE v3.6.3重磅发布:全功能修复与性能飞跃
开发语言·c++·ide·算法·中文语言 玄
Jasmine_llq1 小时前
《P10263 [GESP202403 八级] 公倍数问题》
算法·数论·快速 io 优化·埃氏筛(倍数枚举)·线性遍历求和
橘子汽水1681 小时前
Leetcode 322 279 零钱兑换,完全平方数
算法·leetcode
kevin_kang2 小时前
第01章 VoiceAgent 的总体架构与完整流程
算法