AT_ahc034_a [AHC034A] Leveling with a Dump Truck

Description

[problemUrl]: https://atcoder.jp/contests/ahc034/tasks/ahc034_a $ N\ \times\ N $ マスの土地がある。 一番左上のマスの座標を $ (0,0) $ とし、そこから下方向に $ i $ マス、右方向に $ j $ マス進んだ先のマスの座標を $ (i,j) $ とする。 各マス $ (i,j) $ の高さ $ h_{i,j} $ が入力として与えられる。 全てのマスの高さの合計はちょうど $ 0 $ である。 初期状態で $ (0,0) $ のマスにダンプカーが空の積荷の状態で停まっている。 毎ターン以下の3種類の操作から1つを選んで行うことができる。 - $ 0\

Input Format

入力は以下の形式で標準入力から与えられる。 > $ N $ $ h_{0,0} $ $ \cdots $ $ h_{0,N-1} $ $ \vdots $ $ h_{N-1,0} $ $ \cdots $ $ h_{N-1,N-1} $ 全てのテストケースで $ N\ =\ 20 $ で固定である。 初期状態におけるマス $ (i,j) $ の高さ $ h_{i,j} $ は $ -100\leq\ h_{i,j}\leq\ 100 $ を満たす整数値であり、その総和は $ 0 $ となることが保証されている。

Output Format

操作ターン数を $ T $ とする。 $ t $ ターン目の操作を以下のように文字列 $ s_t $ で表す。 - 現在位置から $ d $ の土砂をダンプカーに積む操作: `+d` - ダンプカーから $ d $ の土砂を現在位置に降ろす操作: `-d` - 隣接するマスへダンプカーを移動させる操作: 上下左右それぞれ `U`、`D`、`L`、`R` このとき、以下の形式で標準出力に出力せよ。 > $ s_0 $ $ \vdots $ $ s_{T-1} $ [例を見る](https://img.atcoder.jp/ahc034/vImT4eac.html?lang=ja&seed=0&output=sample)

Explanation/Hint

### ストーリー AtCoder社は頻繁にオンサイトコンテストを開催しており、コンテスト会場を自前で建設することにした。 建設予定地は山の中にあり、まずは地面を平らに整地しなければならない。 整地にはダンプカーを使用し、土砂を積む、降ろす、運ぶそれぞれに対してコストがかかる。 できるだけ少ないコストで整地を行う方法を求めてほしい。 ### 得点 出力した操作列の合計コストを $ \mathrm{cost} $ とする。 全ての $ (i,j) $ について $ |h_{i,j}| $ の和を取ったものを $ \mathrm{base} $ とする。 マス $ (i,j) $ の最終的な高さを $ h_{i,j}' $ としたとき、$ h_{i,j}'\neq\ 0 $ であるような全ての $ (i,j) $ について $ 100|h_{i,j}'|+10000 $ の和を取ったものを $ \mathrm{diff} $ と定義する。 このとき、以下の得点が得られる。 \\\[ \\mathrm{round}\\left(10^9\\times \\frac{\\mathrm{base}}{\\mathrm{cost}+\\mathrm{diff}}\\right) \\\] テストケースは全部で 150 個あり、各テストケースの得点の合計が提出の得点となる。 一つ以上のテストケースで不正な出力や制限時間超過をした場合、提出全体の判定がWAやTLEとなる。 コンテスト時間中に得た最高得点で最終順位が決定され、コンテスト終了後のシステムテストは行われない。 同じ得点を複数の参加者が得た場合、提出時刻に関わらず同じ順位となる。 ### 入力生成方法 必ずしも理解する必要はありません。 Web版ビジュアライザのseed値を変えて、どのような入力が生成されるかを眺めることをオススメします。 $ L $ 以上 $ U $ 以下の整数値を一様ランダムに生成する関数を $ \mathrm{rand}(L,U) $ で表す。 乱数シード $ \mathrm{seed} $ を元に、$ -1 $ 以上 $ 1 $ 以下の範囲にスケーリングされた二次元の [Perlin noise](https://ja.wikipedia.org/wiki/%E3%83%91%E3%83%BC%E3%83%AA%E3%83%B3%E3%83%8E%E3%82%A4%E3%82%BA) を生成する関数を $ \mathrm{noise}(y,x,\mathrm{seed}) $ で表す。 まずはじめに、Perlin noise 生成に用いるシード値 $ \mathrm{seed}=\mathrm{rand}(0,2^{32}-1) $ を生成する。 次に、各 $ (i,j) $ について、$ h_{i,j}=\mathrm{round}(\mathrm{noise}(i/10,j/10,\mathrm{seed})\times\ 50) $ を生成する。 もし全ての $ (i,j) $ で $ h_{i,j}=0 $ であれば、$ \mathrm{seed} $ を生成し直す。 $ h_{i,j} $ の総和を $ S $ とする。 $ S=0 $ となるよう、以下のようにして変形を行う。 全ての座標 $ (0,0),(0,1),\cdots,(N-1,N-1) $ を一様ランダムな順番にシャッフルし、その $ k $ 番目の座標を $ (i_k,j_k) $ とする。 $ S\ >\ 0 $ ならば、各 $ k=0,1,\cdots,S-1 $ について、$ h_{i_{k\%\ N^2},j_{k\%\ N^2}} $ を $ 1 $ 減らす。 $ S\ ならば、各\ k=0,1,\cdots,-S-1 $ について、$ h_{i_{k\%\ N^2},j_{k\%\ N^2}} $ を $ 1 $ 増やす。 ### ツール(入力ジェネレータ・ビジュアライザ) - [Web版](https://img.atcoder.jp/ahc034/vImT4eac.html?lang=ja): ローカル版より高性能でアニメーション表示が可能です。 - [ローカル版](https://img.atcoder.jp/ahc034/vImT4eac.zip): 使用するには[Rust言語](https://www.rust-lang.org/ja)のコンパイル環境をご用意下さい。 - [Windows用のコンパイル済みバイナリ](https://img.atcoder.jp/ahc034/vImT4eac_windows.zip): Rust言語の環境構築が面倒な方は代わりにこちらをご利用下さい。 コンテスト期間中に、ビジュアライズ結果の共有や、解法・考察に関する言及は禁止されています。ご注意下さい。