[BOJ] 10163. 色紙


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

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

n枚のカラーペーパーが順番に指定された位置に置かれている場合は、各カラーペーパーが見える部分の面積を求めるプログラムを作成します.
入力
入力された第1行は、カラー紙の長さを表す整数N(1≦N≦100)を与える.次に、N枚のカラー紙についての入力は、1枚のカラー紙ごとに1行ずつ与えられる.カラーペーパーが配置される平面は、横方向最大1001格子、縦方向最大1001格子からなるメッシュ形状である.メッシュの各格子は、横、縦1の面積が1の正方形です.
横6グリッドと縦6グリッドからなるグリッドを例に挙げ、各グリッドに表示される値(a,b)がそのグリッドの番号を表す.一番左下の格子は(0,0)一番右上の格子は(5,5)です.

色紙が置かれた状態は、左下隅の格子の番号、幅、高さを4つの整数で表します.例えば、上図に灰色で表示された色紙(1、4)の最左下隅、幅3、高さ2は、1、4、3 2で表される.カラーペーパーがグリッドの境界を超えている場合はありません.
しゅつりょく
入力中に所定の順序でN枚のカラー紙を平面上に置くと、入力中に所定の順序で各行に整数が出力され、各カラー紙表示部の面積は整数となる.カラーペーパーが見えない場合は整数0を出力します.
サブタスク

入力例1
2
0 0 10 10
2 2 6 6
サンプル出力1
64
36
入力例2
3
0 2 10 10
7 9 8 4
8 4 10 6
サンプル出力2
81
25
60
入力例3
4
0 2 10 10
7 9 8 4
8 4 10 6
6 0 12 10
サンプル出力3
62
24
0
120
に答える
質問タイプ:実装
  • 色紙を入力する順に、地図[]]に色紙の領域を数字で表す.
  • 次の色紙が入ってくると、0以外の数字が格納されている場合(前に貼られた色紙の領域であれば)、その色紙の領域-1が表示され、現在の色紙の領域が表示されます.
  • の最後のカラー紙を貼った後、出力領域の幅.
  • *入力時の幅と高さの入力順序が混同されていますので、エラーが発生していますのでご注意ください
    コード#コード#
    import java.io.*;
    import java.util.*;
    
    public class Main_bj_10163_색종이 {
    
    	public static void main(String[] args) throws Exception {
    		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
    
    		int N = Integer.parseInt(br.readLine());
    		int[][] map = new int[1001][1001];
    
    		int[] ans = new int[N + 1];
    		StringTokenizer st;
    
    		for (int i = 1; i <= N; i++) {
    			st = new StringTokenizer(br.readLine(), " ");
    			int y = Integer.parseInt(st.nextToken());
    			int x = Integer.parseInt(st.nextToken());
    			int w = Integer.parseInt(st.nextToken());
    			int h = Integer.parseInt(st.nextToken());
    
    			ans[i] = w * h;
    			
    			int cnt = 0;
    			for (int a = y; a < y + w; a++) {
    				for (int b = x; b < x + h; b++) {
    					if (map[a][b] != 0) {
    						cnt++;
    						ans[map[a][b]] -= 1;
    					}
    					map[a][b] = i;
    				}
    			}
    		}
    		
    	
    		StringBuilder sb = new StringBuilder();
    		for (int i = 1; i <= N; i++)
    			sb.append(ans[i]).append("\n");
    		System.out.println(sb.toString());
    		br.close();
    
    	}
    
    }