[Atelier Blue アトリエブルー]Homeコンテストパソコン甲子園2003年本選>30問目

30問目(シーケンス)

問題

ごめんなさい。めんどくさいので原文参照でお願いします。

入力


X1,Y1,size1(整数,整数,整数)
X2,Y2,size2(整数,整数,整数)


出力

色の付いていないマスの個数(整数)
一番色の濃いマスの目の濃さ(整数)

入力例


2,5,3
3,6,1
3,4,2
4,5,2
3,6,3
2,4,1

出力例


77
5

解き方例

まず、14*14のマップを作ります。そこに対して、入力の座標+2を基準にインクリメントをかけていきます。そのようにすると、はみ出す分を気にせず処理できます。後は、適切な範囲の結果を集計すれば終わりです。

ちなみに、インクリメントの操作は重なる部分があるのでまとめられる部分をまとめておきます。

ソースコード

お持ち帰り

C/C++

#include <stdio.h>

int main(){
    char map[14][14];
    int i,j;
    FILE *fp;
    int sum,max;
    for(i=0;i<14;i++){
        for(j=0;j<14;j++){
            map[i][j] =0;
        }
    }
    fp =fopen("030.dat","r");

    while(!feof(fp)){
        int x,y,m;
        fscanf(fp,"%d,%d,%d\n",&x,&y,&m);

        if(1 <= m){
            map[y+2][x+2]++;
            map[y+3][x+2]++;
            map[y+2][x+3]++;
            map[y+1][x+2]++;
            map[y+2][x+1]++;
        }
        if(2 <= m){
            map[y+1][x+1]++;
            map[y+1][x+3]++;
            map[y+3][x+1]++;
            map[y+3][x+3]++;
        }
        if(3 <= m){
            map[y  ][x+2]++;
            map[y+2][x  ]++;
            map[y+4][x+2]++;
            map[y+2][x+4]++;
        }
    }
    sum = max = 0;
    for(i=2;i<12;i++){
        for(j=2;j<12;j++){
            if(map[i][j] ==0){
                sum++;
            }else{
                if(map[i][j] > max){
                    max = map[i][j];
                }
            }
        }
    }

    printf("%d\n%d\n",sum,max);

    fclose(fp);
    return 0;
}

その他

これで予選問題は終わりです。難問か解けない問題もあったでしょうが数問であれば諦めても良いと思います。どうせ時間何全部は出来ないのでしょうから解ける問題をより素早く解けるようにすべきだと思います。まあ、後はあなた次第です。頑張って。


ページの一番上へ
前のページへ 一覧に戻る
初版2006-5-28
[Atelier Blue アトリエブルー]Homeコンテストパソコン甲子園2003年本選>30問目