NOIP 普及组初赛 · NOIP 2011 普及组初赛试题 第 27 题

完善程序 · 答案 cin>>b[i][j]m1-m2+1good=truem2haveAns=true · 考点:输入输出、位运算、分支结构、循环结构、二维数组与多维数组

← 整套速查表 NOIP 普及组初赛 全部真题

题目

完善程序 (子矩阵)给输入一个 $n_1\times m1$ 的矩阵 $a$,和 $n_2\times m_2$ 的矩阵 $b$,问 $a$ 中是否存在子矩阵和 $b$ 相等。若存在,输出所有子矩阵左上角的坐标:若不存在输出 $\texttt{There is no answer}$。

#include<iostream>
using namespace std;

const int SIZE = 50;

int n1,m1,n2,m2,a[SIZE][SIZE],b[SIZE][SIZE];


int main()
{
    int i,j,k1,k2;
    bool good ,haveAns;

    cin>>n1>>m1;
    for(i=1;i<=n1;i++)
       for(j=1;j<=m1;j++)
          cin>>a[i][j];
          
    cin>>n2>>m2;
    for(i=1;i<=n2;i++)
       for(j=1;j<=m2;j++)
           [   ①     ];
          
    haveAns=false;
    for(i=1;i<=n1-n2+1;i++)
       for(j=1;j<= [    ②     ];j++){
            [   ③    ];
           for(k1=1;k1<=n2;k1++)
               for(k2=1;k2<=[    ④    ] ;k2++){
                  if(a[i+k1-1][j+k2-1]!=b[k1][k2])
                     good=false;
               }
          if(good){
             cout<<i<<' '<<j<<endl;
             [       ⑤      ];
 

(本题为阅读程序 / 完善程序,完整题目与测试数据见平台)
答案:cin>>b[i][j]m1-m2+1good=truem2haveAns=true

考点

输入输出位运算 讲解 →位运算 真题汇总 →分支结构循环结构二维数组与多维数组

解题思维

看到子矩阵匹配 → 先定左上角范围,再重置标记逐元素比对。

常见错误

第二空易漏+1写成m1-m2;第三空易误填false导致永远不匹配。

详细解析(节选)

考点:二维数组遍历|子矩阵匹配

程序在做什么

输入两矩阵后,暴力枚举矩阵a中所有能容纳矩阵b的左上角位置,逐元素比对判断是否相等,若存在则输出坐标并标记已找到。

同考点真题

在 OI伴学 里做这道题
登录后可计时作答、查看完整六段式解析,并按你的错题自动生成同类练习。
去刷题先做一次 AI 学情诊断