2017-10-08

全国高等専門学校プログラミングコンテスト2017 競技部門に参加しました. 山口県周南市で開催され,特別賞(3位相当)でした.(どうでもいいところで手間かかってるの草)

ルール概要

多角形パズル(物理)を渡されます.

Puzzle Piece
Puzzle Piece
Puzzle Frame
Puzzle Frame

これを読み取ってパソコンで解きます.

Solving Puzzle
Solving Puzzle
Solving Puzzle2
Solving Puzzle2

前年と違うのは,QRコードでヒント情報や,そもそもの図形のベクトルデータが渡される点です. QRコードの情報を使うと,減点されます.

コンポーネント全体

パズルをスキャナで読み取らずに,QRコードを読み取るスキャナ(PuzzleSupporter)と実際にパズルを解くソルバ(PuzzleSolver)に分かれます. スキャナは私が,ソルバはチームメンバの川上さんが担当しました. スキャナは,組み立てるときにどのピースが画面上のどこに配置されているか,を示してくれます. これによって,非常にパズルを速くくみ上げることに成功しました.(フレームにはまるとは言ってない)

../images/procon2017/hoge.jpg

Overview

これは初期段階の絵で,実際は,下にディスプレイを敷いて,そのうえでパズルを組みます. 別の用途に使おうと思っていた私のアクリル板は犠牲となったのだ…

IPC

前回,テキストファイルのやり取りでスキャナとソルバ間の情報をやり取りしていたので,リアルタイムにすべく,Windows Communication Frameworkを用いてIPCしました.

スキャナ

Scan piece
Scan piece
Final version of supporter
Final version of supporter
Binalize
Binalize
QR reading
QR reading

詳しくはプロコン2016の記事を見ると良いでしょう.同じことをリアルタイムにやってるだけです. .Net Framework 4.5, WPF, Emgu.OpenCV 3.0, ZXing.Netを用いました.

ソルバ

私が開発したわけではない(川上さん担当)ので,ざっと説明しますが,「結合度」による,「ビームサーチ」を行います. 結合度は,次の要因により増加します.

  • 辺の一致
  • 辺が途中まで一致
  • 角が180度になる
  • 角が360度になる
../images/procon2017/connectivity.jpg

Connectivity

これは,人の組み方を真似しています.

Microsoft Visual C# 2015, DxLibを用いました.

(実行画面は最初の方に出しています.)

完走した感想

1位のチームは,高そうなスキャナ2台ですか…やべぇ… もう少し画像処理能力を高めれたらなと思いましたが,1位のチームは去年からずっと研究していたそうです.やばいなぁ

ともかく,特別賞を頂けてよかったです.2年目ということもありスケジュール管理などがうまくいった気がします.

Related Links