問題
与えられた座席数の円卓に複数のグループが座ります
各グループは座り出しの位置を希望します
グループの全員が座れないと帰ります
最終的に何人が座れたか?
入力
座席数 グループ数
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;