ページ

2012/07/22

[競技プログラミング][PHP][AtCoder]P-CASカードと高橋君

B - P-CASカードと高橋君 ( This story is a fiction )

時間制限 : 2sec / スタック制限 : 10MB / メモリ制限 : 64MB

問題文

高橋君は来る 7 月 27 日の土用の丑の日に備えて、高級なうなぎを通販で買うことにしました。
支払いはネット銀行を通して行います。
高橋君が利用しているネット銀行のカードの裏には、
下図(※省略)のような縦 9 文字 ×横 9 文字の数字から成る乱数表がついています。
支払う時は、この乱数表の指定された位置から縦横斜めの中で指定された向きに 4 文字連続で抜き出して入力し、
それが正しいかによって本人確認を行います。

(※省略)

入力

入力は以下の形式で標準入力から与えられる。
x y W
c11c12…c19
c21c22…c29
:
:
c91c92…c99
入力は 10 行ある。
1 行目には、抜き出す最初の数字が左から何文字目かを表す整数 x(1≦x≦9)、
抜き出す最初の数字が上から何文字目かを表す整数 y(1≦y≦9)、
抜き出す方向を表す W が空白で区切られて与えられる。
抜き出す方向 W は R、L、U、D、RU、RD、LU、LD のいずれかで与えられ、
抜き出す方向が以下であることを表す。
R : 右方向
L : 左方向
U : 上方向
D : 下方向
RU : 右上に斜め方向
RD : 右下に斜め方向
LU : 左上に斜め方向
LD : 左下に斜め方向
2 行目からの 9 行は、乱数表の数字を表す整数 cij(1≦i,j≦9) が与えられる。
i 行目 j 番目の数字は、乱数表の上から i 番目、左から j 番目の数字が cij であることを表す。
cij は 0-9のいずれかである。

出力

指定された位置から指定された方向に数字を 4 文字抜き出し、それらの数字を標準出力に 1 行で出力せよ。
なお、最後には改行を出力せよ。

出典

B: P-CASカードと高橋君 ( This story is a fiction ) - AtCoder Regular Contest #005 | AtCoder


回答

Submission #35127 - AtCoder Regular Contest #005 | AtCoder
AtCoder/arc005_2.php at master · wada811/AtCoder · GitHub

シンプルな解法で解いたのに何故か通らないケースがあってACにならず諦めた…。
ダメなところがわかったらコメントして教えて下さい…m(_ _)m


追記(2012/07/29)

コメントを頂いて境界上で始まった時に先に移動させるから判定漏れを起こすためだとわかりました。
境界判定は動かす前にやらなきゃいけませんね…。
前にも境界判定でミスってたから弱いんだね。気をつけなきゃダメだ…。
ということで境界判定してから移動したのがコチラ↓
Submission #35542 - AtCoder Regular Contest #005 | AtCoder
長い!めんどくさかった!コレ移動は$wが決まれば統一的な記述ができるよなぁとfunctionにまとめたのがコチラ↓
Submission #35546 - AtCoder Regular Contest #005 | AtCoder
関数の引数に&をつけると参照渡しになってCのポインタみたいに使える。
値を返さなくても関数内で直接大元の値を変更できる。複数の値を変化させたい関数とかで便利。
そして境界判定ももっと簡単にできるだろうということで更に改造。
Submission #35549 - AtCoder Regular Contest #005 | AtCoder
これも参照渡しで方向を変更している。コレは別に参照渡しでなくても良かった。あとswicth文にする必要はなかった。
AtCoder/arc005_2.php at master · wada811/AtCoder
コメントありがとうございました。これですっきりです。