世界の数独イメージ

ナンプレ自動生成エンジン
Version2.0 の特徴
バリエーション対応
株式会社 タイムインターメディア
藤原博文、稲葉直貴、黄檗雅也
さまざまなバリエーションへの対応
Version 1.0
Version 2.0
標準的な問題
様々なタイプの問題
特別
拡張
盤面・マスの表現
逃亡
2次元配列からの
2次元配列
2重ループが出てきて面倒だ
ジグソー対応は面倒だ
x座標、y座標の値が特別な意味を持つ
1次元配列
2次元的に扱うところだけ工夫すればよい
X座標、y座標の値が意味なさなくなるので、
それに代わる方法を考えないといけない。
ルールの本質は何か?
各マスはどのブロックに属するか
ある縦のブロック
ある横のブロック
ある太線で囲まれたブロック
対角線ブロックに含まれることもある
どのブロックもn個のマスからなる
どのマスもいくつかのブロックに属
する
どう実現するのか?
どのブロックもn個のマスからなる
どのマスもいくつかのブロックに属
する
3,8,13,18,23
8
6,7,8,9,10
8,12,13,14,18
1
2
3
4
5
6
7
8
9
10
11 12 13 14 15
16 17 18 19 20
21 22 23 24 25
public class BlockConstraint {
private final ArrayList<Integer[]> block;
class Status {
// セルに入りうる数字の個数
private int numSize ;
// セルが属しているゾーン [cell_idx][...]
private final int[][] blockWhereCellBelong ;
(続く)
// セル : 数字の入るパネル
private int [] cell ;
// 候補 その座標にその値は入るか [idx][r]
private int[] cand ;
// そのブロックに、その数は存在するか [block_idx][n]
private int[] exist ;
// そのブロック内の、その数が入りうるマスの個数 [block_idx][n]
private int[][] candCountOfBlock ;
// 空きマスの数
private int spaceCount;
// ブロックによる制約
private BlockConstraint block;
(続く)
多次元配列
段
⇒ 1次元配列 は常套手
プログラムの 単純化 + 高速化
【例
】
Cパズルプログラミング-再帰編
http://karetta.jp/book-cover/cpuzzle-recursion