[Java]判断一个矩阵是另一个矩阵的子矩阵

【问题描述】

从标准输入中输入一个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,行列数用逗号隔开。

参考代码:

import java.util.Scanner;
public class text10 {
	public static void main(String[] args) {
		Scanner sc = new Scanner(System.in);
		int m = sc.nextInt();
		int[][] M = new int[m][m];
		for(int i=0;i<m;i++) {
			for(int j=0;j<m;j++) {
				M[i][j]=sc.nextInt();
			}
		}
		int n = sc.nextInt();
		int[][] N = new int[n][n];
		for(int i=0;i<n;i++) {
			for(int j=0;j<n;j++) {
				N[i][j]=sc.nextInt();
			}
		}
		for(int i=0;i<m;i++) {
			for(int j=0;j<m;j++) {
				if(M[i][j]==N[0][0]) {
					if(check(M,N,i,j)) {
						System.out.print((i+1));
						System.out.print(",");
						System.out.print(j+1);
						return;
					}else {
						System.out.println("-1");
						return;
					}
				}
			}
		}
	}
	public static boolean check(int[][] a,int[][] b,int x,int y) {
		for(int i=0;i<b.length;i++) {
			for(int j=0;j<b[i].length;j++) {
				if(b[i][j]!=a[x+i][y+j]) {
					return false;
				}
			}
		}
		return true;
	}
}

  • 6
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
好的,这是一个很有意思的问题。我会尽力回答你。 首先,我们需要了解矩阵相乘的基本原理。两个矩阵相乘的结果是一个新的矩阵,其中每个元素都是两个矩阵对应位置上元素的乘积之和。具体来说,设矩阵A为n行m列,矩阵B为m行p列,则它们相乘的结果C为n行p列,其中 C[i][j] = sum(A[i][k] * B[k][j]) (k从1到m) 接下来,我们考虑如何使用分治法来实现矩阵相乘。我们将原始矩阵分为四个矩阵,每个矩阵的大小都是原始矩阵的一半。然后,我们递归地计算每个矩阵的乘积,并将它们组合起来得到最终的结果。这个过程可以用下面的伪代码表示: ``` matrix multiply(matrix A, matrix B) { if (A.rows == 1 && A.cols == 1 && B.rows == 1 && B.cols == 1) { return A * B; // 直接计算1x1矩阵的乘积 } else { matrix A11, A12, A21, A22, B11, B12, B21, B22; // 将A和B分成四个矩阵 partition(A, A11, A12, A21, A22); partition(B, B11, B12, B21, B22); // 递归计算矩阵的乘积 matrix C11 = multiply(A11, B11) + multiply(A12, B21); matrix C12 = multiply(A11, B12) + multiply(A12, B22); matrix C21 = multiply(A21, B11) + multiply(A22, B21); matrix C22 = multiply(A21, B12) + multiply(A22, B22); // 将四个矩阵的乘积组合成一个矩阵 return combine(C11, C12, C21, C22); } } ``` 其中,`partition()`函数将原始矩阵分成四个矩阵,`combine()`函数将四个矩阵组合成一个矩阵。这两个函数的具体实现可以根据具体情况进行调整。 以上就是使用分治法计算矩阵乘积的基本思路。在Java中,你可以使用二维数组来表示矩阵,然后编写相应的分治算法来实现矩阵相乘。你可以尝试自己编写代码,如果有问题,可以随时问我。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值