【c++】判断子矩阵

【问题描述】

从标准输入中输入一个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中的第几行第几列,两个数字用逗号&ldquo;,&rdquo;分隔(从第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,行列数用逗号隔开。

#include <bits/stdc++.h>
using namespace std;
int main() {
	int N[9][9], M[9][9], n, m;
	int i, j;
	bool begain = false;
	cin >> n;
	for (i = 0; i < n; i++)
		for (j = 0; j < n; j++)
			cin >> N[i][j];
	cin >> m;
	for (i = 0; i < m; i++)
		for (j = 0; j < m; j++)
			cin >> M[i][j];
	for (i = 0; i <= n - m; i++) {
		for (j = 0; j <= n - m; j++) {
			if (N[i][j] == M[0][0])
				if (N[i + m - 1][j] == M[m - 1][0] && N[i][j + m - 1] == M[0][m - 1] && N[i + m - 1][j + m - 1] == M[m - 1][m - 1]) {
					int i1, j1;
					for (i1 = 0; i1 < m; i1++)
						for (j1 = 0; j1 < m; j1++)
							if (N[i + i1][j + j1] != M[i1][j1])
								break;
					if (i1 == m && j1 == m)
						begain = true;
				}
			if (begain)
				break;
		}
		if (begain)
			break;
	}
	if (begain)
		cout << i + 1 << ',' << j + 1 << endl;
	else
		cout << -1 << endl;
	return 0;
}

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值