【断念】paizaのレベルアップ問題集「島探し (paizaランク Sランク相当)」 をPHPで解きたい
前回の記事に引き続き、Sランク相当の問題をPHPで解いて記事にしようかと思いましたが、100点が出ないため、断念。
自身のlocal環境とpaizaでコード提出時の出力値がなぜか異なるが原因解明できず、断念しました。
開発環境
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