アルゴリズムチャレンジ-13


リカバリ16967アレイ


質問する


サイズH× W配列Aと2つの整数XとYを持つ場合、大きさは(H+X)× (W+Y)の配列Bは、配列Aと配列AとをX格子下に移動し、Y格子右に移動する配列を重ね合わせることができる.オーバーラップ数を加算します.
すなわち,配列Bの(i,j)の値は次の3つの値の1つである.

配列Bと整数X,Yが与えられた場合,配列Aを求める.

入力


第1行は4つの整数H,W,X,Yを与える.2行目からH+X行にBを配列する要素があります.
配列Aが常に存在する場合のみ入力とする.

しゅつりょく


共H行出力配列Aの要素.

制限



入力例


2 4 1 1
1 2 3 4 0
5 7 9 11 4
0 5 6 7 8

サンプル出力


1 2 3 4
5 6 7 8

コード#コード#

import java.util.*;

public class Main{
    public static int[][] BList;
    public static int[][] AList;
    public static String[][] AStringList;
    public static int i;
    public static int j;
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);

        int H = scanner.nextInt();
        int W = scanner.nextInt();
        int X = scanner.nextInt();
        int Y = scanner.nextInt();

        BList = new int[H+X][W+Y];
        AList = new int[H][W];
        AStringList = new String[H][W];
        for(i=0;i<H+X;i++){
            for(j=0;j<W+Y;j++){
                BList[i][j]=scanner.nextInt();
            }
        }
        findAList(H,W,X,Y);

        for(i=0;i<H;i++){
            for(j=0;j<W;j++){
                AStringList[i][j]=Integer.toString(AList[i][j]);
            }
        }

        for(i=0;i<H;i++) {
            System.out.println(String.join(" ",AStringList[i]));
        }
    }

    public static void findAList(int H, int W, int X, int Y){

       for(i=0;i<X;i++){
           for(j=0;j<W;j++){
               AList[i][j]=BList[i][j];
           }
       }

       for(i=X;i<H;i++){
           for(j=0;j<Y;j++){
               AList[i][j]=BList[i][j];
           }

           for(j=W;j<W+Y;j++){
               AList[i-X][j-Y]=BList[i][j];
           }
       }

       for(i=H;i<H+X;i++){
           for(j=Y;j<W+Y;j++){
               AList[i-X][j-Y]=BList[i][j];
           }
       }

       for(i=H-1;i>=X;i--){
           for(j=W-1;j>=Y;j--){
               AList[i-X][j-Y]=BList[i][j]-AList[i][j];
           }
       }

    }
}