白準-10163号(カラー紙)


質問元:https://www.acmicpc.net/problem/10163
質問する
  • 平面上には、N枚の色の異なる長方形の色紙が順に並んでいる.このとき色紙が斜めに置かれていない場合.すなわち、すべてのカラー紙のエッジは互いに平行であるか、互いに垂直であるか、または両方である.図-1は、1番、2番、3番の3枚の色紙の並び順を示しています.

  • 図1
  • ここでは図-2に示すように、4番のカラー紙をもう1枚置くと、3番のカラー紙が完全に隠れて見えなくなります.そして、1番と2番は部分的に隠し、4番は完全に隠します.

  • 図-2
  • N枚のカラー紙が順番に指定された位置に置かれている場合は、各カラー紙が見える部分の面積を求めるプログラムを作成します.
  • import java.io.BufferedReader;
    import java.io.IOException;
    import java.io.InputStreamReader;
    import java.util.StringTokenizer;
    
    public class Main {
    
        public static void main(String[] args) throws IOException {
            BufferedReader reader = new BufferedReader(new InputStreamReader(System.in));
            int N = Integer.parseInt(reader.readLine());
    
            StringBuilder sb = new StringBuilder();
    
            int[][] paper = new int[1001][1001];
            int[] count = new int[N + 1];
    
            for (int i = 0; i < N; i++) {
                StringTokenizer tokenizer = new StringTokenizer(reader.readLine());
                int col = Integer.parseInt(tokenizer.nextToken());
                int row = Integer.parseInt(tokenizer.nextToken());
                int width = Integer.parseInt(tokenizer.nextToken());
                int height = Integer.parseInt(tokenizer.nextToken());
    
                for (int j = row; j < row + height; j++) {
                    for (int k = col; k < col + width; k++) {
                        paper[j][k] = i + 1;
                    }
                }
            }
    
            for (int i = 0; i < 1001; i++) {
                for (int j = 0; j < 1001; j++) {
                    count[paper[i][j]]++;
                }
            }
    
            for (int i = 1; i <= N; i++) {
                sb.append(count[i]).append("\n");
            }
    
            System.out.println(sb);
        }
    
    }
  • の最大サイズ1001*1001のアレイを発表しました.
  • から入力されたカラー紙に従って、1を増やし、カラー紙の領域を数字で埋めます.
  • の最後に、配列全体を探索し、各色紙表示領域の数字を算出し、正解を導いた.