プログラミングコンテスト
NAGASAKA Yasunori
2003/10/01
http://edu.isc.chubu.ac.jp/naga/index.html で公開中
Table of Contents
http://edu.isc.chubu.ac.jp/naga/index.html で公開中
1 はじめに
2 N-Queen
2.1 N-Queen のルール
2.2 コンテストのルール
2.3 現在の記録
2.4 応募方法
3 大富豪
3.1 更新履歴
3.2 コンテストのルール
3.3 プログラミングキットの配布
3.4 コンテストの日程
1 はじめに
プログラミングの練習のために、対戦型のゲームやパズルを題材として プログラミングコンテストを開催することにしました。 自分のプログラミングの能力を知るために挑戦してみて下さい。
電子工学科3年生の人は、 冬になるとそろそろ来年の研究室をどこにしようかと考えると思います。 もし、私の研究室を希望するのなら、以下の課題に挑戦してみてもよいと思います。 どの課題もプログラム作成の技術が要求され、 アルゴリズムを工夫する必要があります。 よってこの中の一つでもきちんと作ることができれば、 優れたプログラム作成能力があると認められます。 過去の卒研生でも、 これらの課題ができた人の多くは卒業研究でも優れた成果を挙げています。
2 N-Queen
このページは卒業生の鈴村君が作成したページをもとにして、 一部変更しています。 オリジナルページを提供してくれた鈴村君に感謝します。
2.1 N-Queen のルール
皆さんは、チェスの Queen の駒の動き方を知っていますか? 知らないよ〜という人のために説明します。 Queen は将棋でいう飛車と角を合わせた動きのできる駒です。 下の図のようになります。
Queen の動ける範囲
矢印の届く範囲のマス目(利き筋といいます)に他の駒がいた場合、 その駒は Queen に取られてしまいます。
さて、この Queen という駒を盤上に複数配置する場合 1 つもお互いにぶつからない (他の Queen の利き筋に入らない)ようにするにはどのように並べればよいでしょうか ? 例として 5×5 のマス目に 5 個の Queen を配置する場合で考えてみましょう。 下の図を見てください。
5 Queen
このように並べると、それぞれの Queen は互いにぶつかりません。 ここでは一つの配置パターンだけを示しましたが他にもいくつか存在します。 このようにして、N×Nのマス目に N 個の Queen を配置する場合に、 すべての可能な配置パターンを求めるのが N-Queen 問題です。 そしてこのコンテストでは、何通りの配置ができるかを数え上げるプログラムを C 言語で作成することにします。 配置パターンの中には上下対称、左右対称、回転対称など、 一見すると別の解なんだけど本質は同じものが多く存在します。 ここでは、そのような配置パターンはすべて "別の解" としてカウントします。 別の表現をするなら対称性のチェックは必要ありません。
2.2 コンテストのルール
コンテストは 2 段階あります。
標準レベルができないうちは上級レベルに取り組んではいけません。
標準レベル
: N が指定された時に解の総数を数え上げるプログラムを作成する。 計算速度はここでは問題ではなく、正しく動作することが必要である。
アルゴリズムは自分で考えなくてはならず、 アルゴリズムの参考書などを見てはいけない。
参考データ:8-Queen(8×8のマス目で Queen 8 個) のとき、 92 通りの配置ができます。
上級レベル
: 作成したプログラムをなるべく高速化する。
アルゴリズムの参考書など、何を見て改良してもよい。
現在は N=13 のときの解の総数を何秒で求められるかを競っている。 最新のコンピュータなら 5 秒、少し前の古いコンピュータなら 10 秒を切ることができればまずまずでしょう。
2.3 現在の記録
いずれも CPU : Pentium4 2GHz を使用した場合の記録です。
N=13 の場合、解の総数は 73712 で 0.30 秒
N=14 の場合、解の総数は 365596 で 1.61 秒
N=15 の場合、解の総数は 2279184 で 10.90 秒
2.4 応募方法
完成したプログラムのソースファイルを持って (FD, CD-R, USB メモリなど) 研究室に来るとか、メール(添付ファイルではなく、 テキスト形式でメールの本文に埋め込んで下さい)で送るなどなど・・・。 とにかく、ソースさえあればなんとでもなります。 速度の測定はこちらでなるべく公正に行います。 速度の比較では、 同一のマシンで同一のコンパイルオプションでコンパイルした実行ファイルを使って比較します。 通常は、UNIX 上で以下のように gcc に最適化オプションを指定してコンパイルします。
% gcc -O -o file file.c
このコンテストは年中やっていますので、完成したらいつでもどうぞ。
3 大富豪
3.1 更新履歴
更新履歴はパッケージの README.txt にも同様の記述があります。
Ver. 0.99 (01/17/2008)
プレイヤが srandom() を実行することで、 サーバ内部で使用する乱数列に影響を及ぼすことができる不具合を修正しました。
Ver. 0.98 (02/02/2007)
カードを交換する時に、 配列の存在する範囲を越える添字を指定した場合でも交換してしまう不具合を修正しました。
Ver. 0.97 (11/30/2005)
Joker を 2 枚持っている場合に同時に出せない不具合を修正しました。
Ver. 0.96 (01/12/2005)
SearchStrictStraight() の説明で不足していた部分を追加しました。
関数名の重複を防ぐための説明を追加しました。
5 枚以上のペアを受け付けないようにしました。
表示モード verbose の動作を一部変更しました。
機能はそのままですが、いくつかの部分で細かな調整を行いました。
Ver. 0.95 (12/06/2004)
sample4.c, sample5.c が強いので配布キットから外すか、 弱くしておいた方がプログラミングの練習になるという意見があったので、
弱くしました。
Ver. 0.94 (01/28/2004)
ペアを出す時に同じカードを複数回指定しても サーバが受け付けてしまう不具合を修正しました。
Ver. 0.93 (10/28/2003)
sample5.c で正しくない straight を生成する不具合を修正しました。
3 人以下でプレイする場合に、 身分が正しく設定されない不具合を修正しました。
ダウンロード用のパッケージにデバッグ用の設定が残っていて、 正しく動作しない問題を直しました。
Ver. 0.92 (10/07/2003)
ストレートの判定の不具合を修正しました。
ストレートの条件を一つ追加しました。
カレントディレクトリがサーチパスに含まれていない場合に発生する コンパイル時の不具合を修正しました。 併せて README.txt の記述を一部変更しました。
Ver. 0.91 (09/08/2003)
最初の公開 version です。
3.2 コンテストのルール
トランプのゲーム「大富豪」のカードを出す戦略を考える対戦 プログラムを作成します。
対戦は専用のサーバプログラムの下で行います。プログラムを 作成する際の注意事項等は、以下で配布するプログラミング キットの README.txt に記述されています。
現在予定している対戦の仕方は、参加者を 5 人ずつ組分けして、 各組で予選を行います。各組の上位 1, 2 名が決勝に進めます。
対戦は、はじめに全員が平民で 50 回ゲームをします。その結果 得た得点順に身分を決め、その後身分とカード交換ありで 50 回 ゲームをします。最終的な合計得点で順位を決めます。後半の 50 回は 1 回毎に身分の変動があります。
3.3 プログラミングキットの配布
プログラミングキットは、以下の [ダウンロード] からリンクされているファイルをダウンロードして使って下さい。 プログラミングキットの実行環境は UNIX を想定しています。プログラミングキットは tgz (tar + gzip) という形式で、圧縮して固めてありますので FreeBSD, Linux その他多くの UNIX の場合は、
% tar zxvf fugokit.tgz
として展開して下さい。
tgz 形式は Windows 用の圧縮・解凍ツールでも対応しているものがありますので、 Windows 上でも展開することは可能です。ただし Windows ではコンパイル時に必要となる ツールが標準では用意されていないのでそのままではコンパイルできません。UNIX と互換の 環境を用意すれば Windows 上でもコンパイル、実行できたという報告を受けています。
[ダウンロード]
3.4 コンテストの日程
2003 年度の研究室内の大会を
11/26 (水) 15:10
から開催することが決まりました。 研究室の学生は上記の日時までにプログラムを完成させておくように。 研究室外の人のオープン参加も歓迎しますので、 興味のある方は上記の日時に研究室までお越し下さい。