【问题描述】 先输入两个矩阵A和B,然后输入替换位置(左上角),编写程序将矩阵A中从替换位置开始的子矩阵(与B同样大小)替换为B,并输出替换后的矩阵。 【输入形式】 从控制台先输入矩阵A的行数和列数(行数和列数均大于等于1,小于等于20),然后在新的行上输入矩阵A的各行数字(以一个空格分隔的整数)。再以同样的方式输入矩阵B。最后输入替换位置(用一个空格分隔的两个整数表示,行数和列数都从1开始计数,因此两个整数都大于等于1)。若替换位置超出了矩阵A的行数或列数,则原样输出矩阵A。 【输出形式】 在标准输出上分行输出替换后的矩阵,每行中各数字之间以一个空格分隔。 【输入样例1】 5 6 10 2 34 -1 800 90 2 76 56 -200 23 1 35 0 0 98 8 3000 2000 100 -1 1 2 0 8 7 85 963 496 8 2 3 9 9 9 9 9 9 3 3 【输出样例1】 10 2 34 -1 800 90 2 76 56 -200 23 1 35 0 9 9 9 3000 2000 100 9 9 9 0 8 7 85 963 496 8 【样例1说明】 输入的矩阵A为5行6列,矩阵B是2行3列,替换位置为第3行的第3列,即:将A中第3行第3列开始的、行数为2列数为3的子矩阵替换为B。 【输入样例2】 3 4 10 2 34 -1 2 76 56 -200 35 0 0 98 2 3 9 9 9 9 9 9 2 3 【输出样例2】 10 2 34 -1 2 76 9 9 35 0 9 9 【样例2说明】 输入的矩阵A为3行4列,矩阵B是2行3列,替换位置为第2行的第3列,即:将A中第2行第3列开始的、行数为2列数为3的子矩阵替换为B。但该子矩阵超出了A的范围,所以只实现了部分替换。 【评分标准】 该题要求输出替换后的矩阵,共有5个测试点,提交程序文件名为example2.c或example2.cpp。 |
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
int main()
{
int a[21][21];
int b[21][21];
int m,n;
int m1,n1;
int s1,s2;
int i,j;
freopen("../123.txt","r",stdin);
while(scanf("%d%d",&m,&n)!=EOF)
{
memset(a,'\0',sizeof(a));
memset(b,'\0',sizeof(b));
for(i=1;i<=m;i++)
for(j=1;j<=n;j++)
scanf("%d",&a[i][j]);
scanf("%d%d",&m1,&n1);
for(i=0;i<m1;i++)
for(j=0;j<n1;j++)
scanf("%d",&b[i][j]);
scanf("%d%d",&s1,&s2);
int mm=(m>s1+m1-1)?s1+m1-1:m;
int nn=(n>s2+n1-1)?s2+n1-1:n;
if(s1<=m&&s2<=n)
for(i=s1;i<=mm;i++)
for(j=s2;j<=nn;j++)
a[i][j]=b[i-s1][j-s2];
for(i=1;i<=m;i++)
{
for(j=1;j<=n;j++)
printf("%d ",a[i][j]);
printf("\n");
}
printf("\n");
}
return 0;
}