完善程序 · 答案 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;
[ ⑤ ];
(本题为阅读程序 / 完善程序,完整题目与测试数据见平台)看到子矩阵匹配 → 先定左上角范围,再重置标记逐元素比对。
第二空易漏+1写成m1-m2;第三空易误填false导致永远不匹配。
考点:二维数组遍历|子矩阵匹配
输入两矩阵后,暴力枚举矩阵a中所有能容纳矩阵b的左上角位置,逐元素比对判断是否相等,若存在则输出坐标并标记已找到。