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; }