1. 程式人生 > >2011年第二題

2011年第二題

【問題描述】

先輸入兩個矩陣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;
}