pilloty
@pilloty (HIRO)

Are you sure you want to delete the question?

If your question is resolved, you may close it.

Leaving a resolved question undeleted may help others!

We hope you find it useful!

【断念】paizaのレベルアップ問題集「島探し (paizaランク Sランク相当)」 をPHPで解きたい

前回の記事に引き続き、Sランク相当の問題をPHPで解いて記事にしようかと思いましたが、100点が出ないため、断念。
自身のlocal環境とpaizaでコード提出時の出力値がなぜか異なるが原因解明できず、断念しました。
島探し_提出結果.png

開発環境

OS

% sw_vers
ProductName:    macOS
ProductVersion: 11.1
BuildVersion:   20C69

エディター

ATOM version1.53.0

その他

・MAMP version 6.3(PHPversion 7.4.12)
・ブラウザ:Chrome

local環境構築の記事
https://qiita.com/pilloty/items/4ad567d3f289470e938c

断念理由

「テスト4、ケース 2(境界値データ)」が突破できない

ゴール

「テスト4、ケース 2(境界値データ)」を突破する
→下記コード×「テスト4、ケース 2(境界値データ)」で、"24"を出力(できればいいと思われる)
→→標準入力の取得方法に変更の必要あり??

paiza提出ソースコード

<?php
//複数行の標準入力を配列に詰める

while ($line = trim(fgets(STDIN))) {
    $tmp[] = $line;
}
//$tmp = array("1 100",1,0,0,0,0,0,0,1,0,0,1,1,0,0,1,0,0,1,1,0,0,1,0,1,0,1,1,0,1,1,1,0,0,0,1,1,0,1,1,0,0,1,1,1,1,0,1,0,0,0,1,1,0,0,1,0,1,1,0,0,1,1,1,1,1,1,1,1,0,0,0,1,0,1,0,1,0,0,0,0,0,0,0,0,1,1,0,0,1,0,0,0,0,1,1,0,0,1,1,1);
//var_dump($tmp);

$temp_explode = explode(" " ,$tmp[0]);
$column_number = $temp_explode[0];//列数
$row_number = $temp_explode[1];//行数

for($i=0; $i<$row_number; $i++){
    $temp_explode_i = explode(" " ,$tmp[$i+1]);
    $ii = 1;
    foreach($temp_explode_i as $e){
        $target_num_array[$i+1][$ii]= $e; //$i+1=行数 $ii=列数
        $ii++;
    }
}
for($i=0; $i<$column_number+2; $i++){
  $insert_row_e_one[$i] = "0";
}
$insert_row_e_end = $insert_row_e_one;

array_unshift($target_num_array,$insert_row_e_one);
array_push($target_num_array,$insert_row_e_end);
$add_el = "0";
for($j=0; $j<$row_number; $j++){
  array_unshift($target_num_array[$j+1],$add_el);
  array_push($target_num_array[$j+1],$add_el);
}

$l = 0;
$arleady_array = [];
$count_num = 0;
for($k=0; $k<$row_number; $k++){
  for($kk=0; $kk<$column_number; $kk++){
    if($target_num_array[$k+1][$kk+1]==1){
      $target_row_num = $k+1;
      $target_col_num = $kk+1;
      $land = array($target_row_num.",".$target_col_num);
      $target_num_array[$target_row_num][$target_col_num] = "0";
      //今回の周回の起点と連なる陸地?がなくなるまで繰り返し処理
      while($land){
        $target = explode(",",$land[0]);
        $target_row_num = $target[0]; //今回の周回の起点となる行
        $target_col_num = $target[1]; //今回の周回の起点となる列

        //起点から起算して上の(行、列)が、まだ島判定していない(行、列)の組み合わせの場合のみ、島判定処理を通す
        $up_row_num = $target_row_num -1; //起点から起算して上の行
        $up_col_num = $target_col_num;
        if(!(in_array($up_row_num.",".$up_col_num, $arleady_array))){
          if($target_num_array[$up_row_num][$up_col_num]==1){ //上
            $land[] = $up_row_num.",".$up_col_num;
            $target_num_array[$up_row_num][$up_col_num] = "0";
          }
        }
        $down_row_num = $target_row_num+1; //起点から起算して下の行
        $down_col_num = $target_col_num;
        if($target_num_array[$down_row_num][$down_col_num]==1){ //下
          $land[] = $down_row_num.",".$down_col_num;
          $target_num_array[$down_row_num][$down_col_num] = "0";
        }
        //起点から起算して左の(行、列)が、まだ島判定していない(行、列)の組み合わせの場合のみ、島判定処理を通す
        $left_row_num = $target_row_num;
        $left_col_num = $target_col_num-1; //起点から起算して左の列
        if(!(in_array($left_row_num.",".$left_col_num, $arleady_array))){
          if($target_num_array[$left_row_num][$left_col_num]==1){ //左
            $land[] = $left_row_num.",".$left_col_num;
            $target_num_array[$left_row_num][$left_col_num] = "0";
          }
        }
        $right_row_num = $target_row_num;
        $right_col_num = $target_col_num+1; //起点から起算して右の行
        if($target_num_array[$right_row_num][$right_col_num]==1){ //右
          $land[] = $right_row_num.",".$right_col_num;
          $target_num_array[$right_row_num][$right_col_num] = "0";
        }
        $arleady_array[] = $target_row_num.",".$target_col_num;
        array_shift($land);
      }
      $count_num += 1;
    }
  }
}

$answer =  $count_num;
echo $answer;
?>

該当の標準入力

1 100
1
0
0
0
0
0
0
1
0
0
1
1
0
0
1
0
0
1
1
0
0
1
0
1
0
1
1
0
1
1
1
0
0
0
1
1
0
1
1
0
0
1
1
1
1
0
1
0
0
0
1
1
0
0
1
0
1
1
0
0
1
1
1
1
1
1
1
1
0
0
0
1
0
1
0
1
0
0
0
0
0
0
0
0
1
1
0
0
1
0
0
0
0
1
1
0
0
1
1
1

自分で試したこと

local環境での出力値チェック

localソースコード

インプット(標準入力)取得ロジック以外は提出したソースコードと同じです

<?php
//URL https://paiza.jp/works/mondai/skillcheck_sample/search-island?language_uid=php

/* 複数行の標準入力を配列に詰める
    while ($line = trim(fgets(STDIN))) {
        $tmp[] = $line;
    }
*/
//複数行の標準入力を配列に詰める
$file = fopen("/Applications/MAMP/htdocs/test_data/practice/island4.txt", "r");

// ファイルの内容を一行ずつ配列に代入します
if($file) {
  while ($line = fgets($file)) {
    $tmp[] = trim($line);
  }
}
$temp_explode = explode(" " ,$tmp[0]);
$column_number = $temp_explode[0];//列数
$row_number = $temp_explode[1];//行数

for($i=0; $i<$row_number; $i++){
  $temp_explode_i = explode(" " ,$tmp[$i+1]);
  $ii = 1;
  foreach($temp_explode_i as $e){
    $target_num_array[$i+1][$ii]= $e; //$i+1=行数 $ii=列数
    $ii++;
  }
}
for($i=0; $i<$column_number+2; $i++){
  $insert_row_e_one[$i] = 0;
}
$insert_row_e_end = $insert_row_e_one;

array_unshift($target_num_array,$insert_row_e_one);
array_push($target_num_array,$insert_row_e_end);

$add_el = "0";

for($j=0; $j<$row_number; $j++){
  array_unshift($target_num_array[$j+1],$add_el);
  array_push($target_num_array[$j+1],$add_el);
}

$l = 0;
$arleady_array = [];
for($k=0; $k<$row_number; $k++){
  for($kk=0; $kk<$column_number; $kk++){
    if($target_num_array[$k+1][$kk+1]==1){
      $target_row_num = $k+1;
      $target_col_num = $kk+1;
      $land = array($target_row_num.",".$target_col_num);
      $target_num_array[$target_row_num][$target_col_num] = "0";
      while($land){
        $target = explode(",",$land[0]);
        $target_row_num = $target[0]; //今回の周回の起点となる行
        $target_col_num = $target[1]; //今回の周回の起点となる列

        //起点から起算して上の(行、列)が、まだ島判定していない(行、列)の組み合わせの場合のみ、島判定処理を通す
        $up_row_num = $target_row_num -1; //起点から起算して上の行
        $up_col_num = $target_col_num;
        if(!(in_array($up_row_num.",".$up_col_num, $arleady_array))){
          if($target_num_array[$up_row_num][$up_col_num]==1){ //上
            $land[] = $up_row_num.",".$up_col_num;
            $target_num_array[$up_row_num][$up_col_num] = "0";
          }
        }
        $down_row_num = $target_row_num+1; //起点から起算して下の行
        $down_col_num = $target_col_num;
        if($target_num_array[$down_row_num][$down_col_num]==1){ //下
          $land[] = $down_row_num.",".$down_col_num;
          $target_num_array[$down_row_num][$down_col_num] = "0";
        }
        //起点から起算して左の(行、列)が、まだ島判定していない(行、列)の組み合わせの場合のみ、島判定処理を通す
        $left_row_num = $target_row_num;
        $left_col_num = $target_col_num-1; //起点から起算して左の列
        if(!(in_array($left_row_num.",".$left_col_num, $arleady_array))){
          if($target_num_array[$left_row_num][$left_col_num]==1){ //左
            $land[] = $left_row_num.",".$left_col_num;
            $target_num_array[$left_row_num][$left_col_num] = "0";
          }
        }
        $right_row_num = $target_row_num;
        $right_col_num = $target_col_num+1; //起点から起算して右の行
        if($target_num_array[$right_row_num][$right_col_num]==1){ //右
          $land[] = $right_row_num.",".$right_col_num;
          $target_num_array[$right_row_num][$right_col_num] = "0";
        }
        $arleady_array[] = $target_row_num.",".$target_col_num;
        array_shift($land);
      }
      $count_num += 1;
    }
  }
}

$answer =  $count_num;
echo $answer;
?>
標準入力に該当するファイル

paizaからダウンロード

1 100
1
0
0
0
0
0
0
1
0
0
1
1
0
0
1
0
0
1
1
0
0
1
0
1
0
1
1
0
1
1
1
0
0
0
1
1
0
1
1
0
0
1
1
1
1
0
1
0
0
0
1
1
0
0
1
0
1
1
0
0
1
1
1
1
1
1
1
1
0
0
0
1
0
1
0
1
0
0
0
0
0
0
0
0
1
1
0
0
1
0
0
0
0
1
1
0
0
1
1
1

paiza出力値

ブラウザ上で見えている出力値

1

ダウンロードファイル内の出力値

28

※ 上記2つがなぜ異なるのかも不明、Qiitaにて有力な回答がなければ、paizaに問い合わせてみようと思います。
※ 提出コードの下記部分のコメントアウトを解除した状態で、「提出前動作確認」すると、"24"とでます。

//$tmp = array("1 100",1,0,0,0,0,0,0,1,0,0,1,1,0,0,1,0,0,1,1,0,0,1,0,1,0,1,1,0,1,1,1,0,0,0,1,1,0,1,1,0,0,1,1,1,1,0,1,0,0,0,1,1,0,0,1,0,1,1,0,0,1,1,1,1,1,1,1,1,0,0,0,1,0,1,0,1,0,0,0,0,0,0,0,0,1,1,0,0,1,0,0,0,0,1,1,0,0,1,1,1);

local出力値

24

※多分、"24"が正解と思われることは検証済み

結び

アルゴリズムは理解したのでまあいいかと思いますが、100点が取れないのが気持ち悪いので、質問投稿してみました。
もし、わかる人がいれば教えてください。

0

No Answers yet.

Your answer might help someone💌