はじめまして
趣味的な動機でAtcoderを初めて1か月。全然わからない日々が続いております。実は今現在、パイザラーニングに逃げているのが現状だったりします。
さて、競プロ初心者に最大のネック、標準入力
これについて、いろいろと調べていこうと思っています。
まずは直近で悔しかった二次元配列の取得と出力をPHPにて調査してみました。
他の標準入力についても、今後まとめていこうと思っています。
#二次元配列の取得方法
入力例
x | [0] | [1] | [2] | [3] |
---|---|---|---|---|
[0] | 1 | 2 | 3 | 4 |
[1] | 5 | 6 | 7 | 8 |
[2] | 9 | 10 | 11 | 12 |
###(1)データ数が分からないとき
こちらはパイザでも使える標準入力・・・など初心者向けに出てくるパターンです。
どんなデータがどれだけあるか分からないときは下記のコードを利用しましょう。
//1行づつ配列を取得
while ($line = fgets(STDIN)) {
$tmp[] = trim($line);
}
// 1行目の配列をスペース区切りで取得
foreach ($tmp as $value) {
$inp[] = explode(' ', $value);
}
//解説?
//whileで取得したデータ
echo $tmp[0];//出力結果:1 2 3 4
echo $tmp[1];//出力結果:5 6 7 8
//foreachで取得したデータ
echo $inputs[0][0]." ".$inputs[0][2]." ".$inputs[0][2];
//出力結果:1 2 3
echo $inputs[1][0]." ".$inputs[0][2];
//出力結果:5 7
###(2)データ数がわかるとき
入力例の最初の行にWとHが与えられる
H=3 W=4
x | [0] | [1] | [2] | [3] |
---|---|---|---|---|
[0] | 3 | 4 | ||
[1] | 1 | 2 | 3 | 4 |
[2] | 5 | 6 | 7 | 8 |
[3] | 9 | 10 | 11 | 12 |
fscanf(STDIN, '%d %d', $h, $w);//あるいはデータ数で指示
//二次元配列として取得([1]行目から取得)
for ($i = 0; $i < $h; $i++) {
$m[] = explode(' ', trim(fgets(STDIN)));
}
#取得した2次元配列の出力
for( $k = 0; $k < $w; $k++ ) {
for( $j = 0; $j < $h; $j++) {
echo $m[$k][$j], ' ';
}
echo "\n";
}
//二次元配列の出力
for ($k = 0; $k < $w; $k++) {
for ($j = 0; $j < $h; $j++) {
echo $inp[$j][$k], ' ';
}
echo "\n";
}
//(1)を利用した場合、for文の前に下記2行
//$h=$inp[0][0] +1 ;//最初の行を犠牲にするので+1
//$w=$inp[0][1];
//のとき$j=1;とする。
他の出力方法についても今度調べてみよう。
そのうちスピードが速かった回答を分解して研究してみたい。
<?php
//1行目取得
list($h,$w)=explode(" ",trim(fgets(STDIN)));
$i=0;
while( $i<$h){
$m[$i]=explode(" ",trim(fgets(STDIN)));
++$i;
}
//出力
$i=0;
while($i<$w){
$ans=array();
foreach($m as $v){
$ans[]=$v[$i];
}
echo join(" ",$ans)."\n";
++$i;
}
むぅ?「join(" ",$ans)」???なんでこうなるんだ?
join・・・?
引き続き、他の標準入力についても、まとめていきたいと思っています。
PHPで競プロとかレアだもんね。