寝癖頭の解法

学習中の覚え書きを投稿、更新していきます。

C言語による入居者数の管理

C言語による入居者数の管理です。
公舎の入居・退去の情報から、各部屋の入居者数を出力するプログラムです。

・問題
 A大学は1フロア10部屋、3階建ての公舎4棟を管理しています。
 公舎の入居・退去の情報を読み込み、各部屋の入居者数を出力するプログラムを作成して下さい。
 n件の情報が与えられます。
 各情報では、4つの整数b, f, r, vが与えられます。
 これは、b棟f階のr番目の部屋にv人が追加で入居したことを示します。
 vが負の値の場合、-v人退去したことを示します。
 最初、全ての部屋には誰も入居していないものとします。

・入力される値
 最初の行に情報の数 n が与えられます。
 続いて n 件の情報が与えられます。
 各情報には4つの整数 b, f, r, v が空白区切りで1行に与えられます。

・期待する出力
 4棟について入居者数を出力して下さい。
 各棟について、1階、2階、3階の順に入居者数を出力します。
 各階については、1番目、2番目、・・・、10番目の部屋の入居者数を順番に出力します。
 入居者数の前には1つの空白を出力して下さい。
 また、各棟の間には####################(20個の#)で区切って下さい。

・条件
 間違った棟番号・階・部屋番号は与えられない。
 管理の過程で1部屋の入居者数が0より少なくなることはない。
 管理の過程で1部屋の入居者数が9より多くなることはない。

僕が作成、提出したコードは、以下のとおりです。

/*
 ITP1_6_C : Official House
 http://judge.u-aizu.ac.jp/
 C言語による入居者数の管理
 https://neguse-atama.hatenablog.com
*/
#include<stdio.h>
#include<string.h>
int main(void){
    int n,i,j,b,f,r,v;
    char house[4][3][32] = {0};
    for (i = 0; i < 4; i++){
        for (j = 0; j < 3; j++){
            strcpy(house[i][j], " 0 0 0 0 0 0 0 0 0 0");
        }
    }
    scanf("%d",&n);
    while (n-->0){
        scanf("%d %d %d %d", &b, &f, &r, &v);
        house[b-1][f-1][r*2-1]+=v;
    }
    for (i=0;i<4;i++){
        for (j=0;j<3;j++){
            puts(house[i][j]);
        }
        if (i < 3){
            printf("####################\n");
        }
    }
    return 0;
}

設問の出典は、プログラミング問題のオンライン採点システム「Aizu Online Judge(AOJ)」です。
http://judge.u-aizu.ac.jp/onlinejudge/
ITP1_6_C : Official House