// 幅優先探索で調べる public IEnumerable <Move> Solve(OthBoard board) { // 最初はどこに打っても同じなので、ひとつに固定。 int p = board.ToIndex(3, 4); board.Put(board.Turn, p); var queu = new Queue <OthBoard>(); queu.Enqueue(new OthBoard(board)); var current = board; while (queu.Count != 0) { //キューの先頭からノード currentNode を取り出す current = queu.Dequeue(); if ((current.StoneCount(Stone.Black) == 0) || (current.StoneCount(Stone.White) == 0)) { // 解がひとつ見つかれば終了。その手順を返す。 return(current.GetMoves()); } foreach (var pos in current.PutablePlaces(current.Turn)) { var next = new OthBoard(current); next.Put(next.Turn, pos); // 試した手の状態はキューに入れる queu.Enqueue(next); } } // 見つからなかった return(new Move[0]); }
// 棋譜を再現 private static void Replay(IEnumerable <Move> moves) { var board = new OthBoard(); board.Print(); Console.ReadLine(); foreach (var move in moves) { Console.SetCursorPosition(0, 0); board.Put(move.Stone, move.Place); board.Print(); Console.ReadLine(); } }
static void Main(string[] args) { var board = new OthBoard(); var sol = new Solver(); var moves = sol.Solve(board); // 結果の棋譜を表示 foreach (var move in moves) { var(x, y) = board.ToLocation(move.Place); Console.WriteLine($"{move.Stone.Value} ({x}, {y})"); } Console.WriteLine("Enterキーを押してください。"); Console.ReadLine(); // 棋譜を再現 Replay(moves); }
// コンストラクタ (Cloneと同じ用途) public OthBoard(OthBoard board) : base(board) { Turn = board.Turn; Moves = board.Moves.ToList(); }