2014年3月20日木曜日

AOJ 0026 c

AOJの0026、10×10のマスにインクを落として空白マスの数と最も濃いところの濃さを出力する問題です
http://judge.u-aizu.ac.jp/onlinejudge/description.jsp?id=0026



2次元配列のいい練習になりました。
問題を見てわかる通り、これはインクを端に落とされると枠から外れてしまうのでどうしよう的な所がポイントだと思います。(個人的に)

0行0列、あるいは1行1列に落とされた時の場合分けをすれば、と思ったのですがなんだかごちゃごちゃしそうだったので、結局周りに余分に2マス分(つまり14×14のマス)を用意しました。インクが落とされるのは真ん中の10×10だけにして、最終的に答えを集計するのも10×10というわけです。余分に2マスとってあるので端に大きさ3のインクを落とされても大丈夫。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
#include <stdio.h>
 
int main(void)
{
    int x,y,size,i,j,blank,max;
    int map[14][14];
 
    for(i = 0; i < 14; i++)
    {
        for(j = 0; j < 14; j++)
        {
            map[i][j] = 0;
        }
    }
 
    while(scanf("%d,%d,%d",&x,&y,&size) != EOF)
    {
        if (size == 1)
        {
            map[x+1][y+2] += 1;
            map[x+2][y+1] += 1;
            map[x+2][y+2] += 1;
            map[x+2][y+3] += 1;
            map[x+3][y+2] += 1;
        }
        else if (size == 2)
        {
            map[x+1][y+1] += 1;
            map[x+1][y+2] += 1;
            map[x+1][y+3] += 1;
            map[x+2][y+1] += 1;
            map[x+2][y+2] += 1;
            map[x+2][y+3] += 1;
            map[x+3][y+1] += 1;
            map[x+3][y+2] += 1;
            map[x+3][y+3] += 1;
        }
        else if (size == 3)
        {
            map[x][y+2] += 1;
            map[x+1][y+1] += 1;
            map[x+1][y+2] += 1;
            map[x+1][y+3] += 1;
            map[x+2][y] += 1;
            map[x+2][y+1] += 1;
            map[x+2][y+2] += 1;
            map[x+2][y+3] += 1;
            map[x+2][y+4] += 1;
            map[x+3][y+1] += 1;
            map[x+3][y+2] += 1;
            map[x+3][y+3] += 1;
            map[x+4][y+2] += 1;
        }
    }
 
    blank = 0;
    max = 0;
 
    for(i = 2; i < 12; i++)
    {
        for(j = 2; j < 12; j++)
        {
            if (map[i][j] == 0)
            {
                blank += 1;
            }
            if (map[i][j] > max)
            {
                max = map[i][j];
            }
        }
    }
 
    printf("%d\n", blank);
    printf("%d\n", max);
 
    return 0;
}

0 件のコメント:

コメントを投稿