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

    1. #include <stdio.h>
    2. int main()
    3. {
    4. int n;
    5. scanf("%d",&n);
    6. int a[n][n];
    7. int i,j;
    8. for(i=0;i<n;i++)
    9. {
    10. for(j=0;j<n;j++)
    11. {
    12. scanf("%d",&a[i][j]);
    13. }
    14. }
    15. int m;
    16. scanf("%d",&m);
    17. int b[m][m];
    18. for(i=0;i<m;i++)
    19. {
    20. for(j=0;j<m;j++)
    21. {
    22. scanf("%d",&b[i][j]);
    23. }
    24. }
    25. int p,q;
    26. int res=0;
    27. int flag=m*m;
    28. int len=0;
    29. int mark[100][2];
    30. for(p=0;p<n-m+1;p++)
    31. {
    32. for(q=0;q<n-m+1;q++)
    33. {
    34. len=0;
    35. for(i=p;i<p+m;i++)
    36. {
    37. for(j=q;j<q+m;j++)
    38. {
    39. if(a[i][j]==b[i-p][j-q])
    40. {
    41. len++;
    42. // printf("%d %d=%d %d\n",i,j,i-p,j-p);
    43. }
    44. }
    45. }
    46. // printf("%d\n",len);
    47. if(len==flag)
    48. {
    49. mark[res][0]=p;
    50. mark[res][1]=q;
    51. res++;
    52. }
    53. }
    54. }
    55. if(res==0)
    56. {
    57. printf("-1");
    58. return 0;
    59. }
    60. int temp;
    61. for(i=1;i<res;i++)
    62. {
    63. for(j=0;j<res-i;j++)
    64. {
    65. if(mark[j][0]<mark[j+1][0])
    66. {
    67. temp=mark[j][0];
    68. mark[j][0]=mark[j+1][0];
    69. mark[j+1][0]=temp;
    70. }
    71. }
    72. }
    73. for(i=1;i<res;i++)
    74. {
    75. for(j=0;j<res-i;j++)
    76. {
    77. if(mark[j][1]<mark[j+1][1])
    78. {
    79. temp=mark[j][1];
    80. mark[j][1]=mark[j+1][1];
    81. mark[j+1][1]=temp;
    82. }
    83. }
    84. }
    85. printf("%d,%d",mark[0][0]+1,mark[0][1]+1);
    86. return 0;
    87. }

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

    期望输入

    2
    5 5
    6 6
    1
    6

    期望输出

    2,1

    我的输出

    2,2

  • 相关阅读:
    对象,构造函数,构造函数小练习
    实现安全的服务通信:探索如何使用服务网格来确保服务间的安全通信
    如何查看MySQL的安装位置
    LeetCode 刷题 [C++] 第98题.验证二叉搜索树
    ElementuiPlus的table组件实现行拖动与列拖动
    基于快速行进平方法的水面无人船路径规划
    性能测试 —— 生成html测试报告、参数化、jvm监控
    mysql批量插入数据,跳过唯一索引报错
    Flutter TapGestureRecognizer 如何工作
    使用EasyPoi导出word并转换为pdf
  • 原文地址:https://blog.csdn.net/yaoyimingde/article/details/134470903