【问题描述】
从标准输入中输入一个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