LoginSignup
0
0

More than 3 years have passed since last update.

着席確認

Last updated at Posted at 2020-08-15

問題

与えられた座席数の円卓に複数のグループが座ります
各グループは座り出しの位置を希望します
グループの全員が座れないと帰ります
最終的に何人が座れたか?

入力

座席数 グループ数
6 3
グループ人数 座り出しの位置
3 2
1 6
2 6

コード

<?php
//①入力処理:値取得、テーブル座席の配列準備

$nm_array = explode(" ",fgets(STDIN));
//fgetsで入力の1行目を取得しスペースで区切り、$nm_arrayに代入
$seat_num = $nm_array[0];
//座席数
$group_num = $nm_array[1];
//来るグループ数
//echo "シート数:".$seat_num."\n";
//echo "グループ数:".$group_num."\n";

$seat = array();
//席数分の配列を準備
$seat = array_pad($seat, $seat_num, 0);
//配列のレコードを全て0(空席)で埋める
//print_r($seat);


//②グループ毎に空席確認

//グループ分のループ
$count = 0;
//座った人数を数える変数
for($i=0 ; $i < $group_num ; $i++){
//グループ数が$iより小さいうちはループする グループ数分ループする
    $group_array = explode(" ",fgets(STDIN));
    //入力の2行目以降を読み込み、スペースで区切り、配列に代入
    $group_person_num = $group_array[0];
    //グループの人数
    $sit_point = $group_array[1] - 1;
    //グループの座り出しの位置 座る位置は1から始まる為、配列の最初0に合わせる為に-1をする
    //echo "グループの人数:".$group_person_num."\n";
    //echo "着席開始位置:".$sit_point."\n";

    // グループ人数分のループ、空席確認
    $empty_flg = true;
    //空席かどうかの確認のためのフラグ作成 trueは空席
    for($j = $sit_point; $j < $sit_point+$group_person_num; $j++){
    //グループの座り出しの位置がグループの座り出しの位置+グループの人数より大きくなるまでループする 人数分ループする

        //円卓処理
        if($j >= $seat_num){
        //グループの座り出しの位置+ループした回数が座席数以上の時は
            $search_point = $j - $seat_num;
            //確認する座席は、グループの座り出しの位置+ループした回数-座席数 
        }else{
            $search_point = $j;
            //未満の時は確認する座席は、グループの座り出しの位置+ループした回数
        }
        //echo $search_point;

        // 空席確認
        if($seat[$search_point] >0){
        //座席数の配列の確認する番号の値が0より大き時 埋まっている時
            $empty_flg= false;
            ////空席かどうかの確認のためのフラグはfalseにする
            break;
            //ループを抜ける
        }
    }
    //var_dump($empty_flg);


    //③席が空いていたら座る処理
    if($empty_flg == true){
    //もし空席なら
        //グループの人数分のループ、着席処理
        for($j = $sit_point; $j < $sit_point+$group_person_num; $j++){
        //グループの座り出しの位置がグループの座り出しの位置+グループの人数より大きくなるまでループする 人数分ループする
            //円卓処理
            if($j >= $seat_num){
            //グループの座り出しの位置+ループした回数が座席数以上の時は
                $search_point = $j - $seat_num;
                //確認する座席は、グループの座り出しの位置+ループした回数-座席数 
            }else{
                $search_point = $j;
                //未満の時は確認する座席は、グループの座り出しの位置+ループした回数
            }
            //echo $search_point;

            // 着席処理
            $seat[$search_point]=1;
            //座席数の配列の確認する番号の値を1にする
            $count += 1;
            //座った人数を数える変数を+1する
        }

    }
    //print_r($seat);
}
//④出力処理:座った人の人数を出力
echo $count;

整理します


<?php

function Round_table($j,$seat_num){
    if($j >= $seat_num){
        $search_point = $j - $seat_num;
    }else{
        $search_point = $j;
    }
    return $search_point;
}

list($seat_num ,$group_num) = explode(" ",fgets(STDIN));

$seat = array_pad(array(), $seat_num, 0);

$count = 0;

for($i=0 ; $i < $group_num ; $i++){
    list($group_person_num ,$sit_point) = explode(" ",fgets(STDIN));
    $sit_point -= 1;
    $empty_flg = true;

    for($j = $sit_point; $j < $sit_point+$group_person_num; $j++){
        $search_point = Round_table($j,$seat_num);
        if($seat[$search_point] >0){
            $empty_flg= false;
            break;
        }
    }

    if($empty_flg == true){
        for($j = $sit_point; $j < $sit_point+$group_person_num; $j++){
            $search_point = Round_table($j,$seat_num);
            $seat[$search_point]=1;
            $count += 1;
        }
    }
}
echo $count;

さらに整理します


<?php
list($seat_num ,$group_num) = explode(" ",fgets(STDIN));
$seat = array_pad(array(), $seat_num, 0);

$count = 0;

for($i=0 ; $i < $group_num ; $i++){
    list($group_person_num ,$sit_point) = explode(" ",fgets(STDIN));
    $sit_point -= 1;
    $empty_flg = true;

    for($j = $sit_point; $j < $sit_point+$group_person_num; $j++){
        if($seat[$j % $seat_num] > 0){
            $empty_flg = false;
            break;
        }
    }

    if($empty_flg == true){
        for($j = $sit_point; $j < $sit_point+$group_person_num; $j++){
            $seat[$j % $seat_num]=1;
            $count += 1;
        }
    }
}
echo $count;

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0