コード例 #1
0
        static void Main(string[] args)
        {
            int[] dataList = new int[Utility.ROW * Utility.COL * NUM_PROBLEM];

            using (var sr = new StreamReader(filePath))
            {
                int i = 0;
                while (sr.Peek() >= 0)
                {
                    var n = sr.Read() - '0';
                    if (n >= 0 && n <= 9 && i < Utility.ROW * Utility.COL * NUM_PROBLEM)
                    {
                        dataList[i++] = n;
                    }
                }
            }
            //dataList.ToList().ForEach(s => Console.Write(s));



            //2次元行列に変換
            int xynum       = 0;
            var boardMatrix = Utility.GetInit2DimArray <int>(Utility.ROW, Utility.COL);

            for (int i = 0; i < Utility.ROW; i++)
            {
                for (int j = 0; j < Utility.COL; j++)
                {
                    boardMatrix[i][j] = dataList[xynum++];
                }
            }
            //if (dataList.Count() - xynum < 81)
            //{
            //    Console.WriteLine("データが足りません");
            //    Console.ReadLine();
            //    return;
            //}

            Utility.BoardPrint(boardMatrix);

            Solver solver = new Solver();

            bool wholeloopflag = true;

            //CRBE法
            solver.Crbe(boardMatrix);
            if (Utility.IsCompleteBoard(boardMatrix))
            {
                wholeloopflag = false;
                Console.WriteLine("完成!");
            }
            //候補数字書き込み
            var candidateMat = solver.WriteCandidate(boardMatrix);

            Utility.CandidateOutput(candidateMat);
            Console.WriteLine("実行");

            //初回単一法
            solver.DoSingleLogics(boardMatrix, candidateMat);
            if (Utility.IsCompleteBoard(boardMatrix))
            {
                wholeloopflag = false;
                Console.WriteLine("完成!");
            }

            var bufMatrix = Utility.GetInit2DimArray <int>(Utility.ROW, Utility.COL);

            Utility.CopyToBufferMatrix(boardMatrix, bufMatrix);

            //ロジック登録
            var logics = new LogicDelegate()
            {
                CombinationNo = 8
            }.GetLogicCombination(solver);

            var bufferMatrix = Utility.GetInit2DimArray <int>(Utility.ROW, Utility.COL);

            //処理前盤面記憶
            Utility.CopyToBufferMatrix(candidateMat, bufferMatrix);
            bool loopFlag = true;

            while (wholeloopflag)
            {
                //定石Aのみ盤面変化ならループ
                while (loopFlag)
                {
                    //処理前盤面記憶
                    Utility.CopyToBufferMatrix(candidateMat, bufferMatrix);

                    //●●●●定石A●●●●//
                    logics[0](boardMatrix, candidateMat);

                    loopFlag = Utility.IsChangeBoard(candidateMat, bufferMatrix);

                    //完成時強制終了
                    if (Utility.IsCompleteBoard(boardMatrix))
                    {
                        goto endLabel;
                    }

                    //if (loopFlag) Utility.CandidateOutput(candidateMat);
                }
                loopFlag = true;
                //処理前盤面記憶
                Utility.CopyToBufferMatrix(candidateMat, bufferMatrix);

                //●●●●定石B●●●●//
                logics[1](boardMatrix, candidateMat);

                //完成時強制終了
                if (Utility.IsCompleteBoard(boardMatrix))
                {
                    break;
                }

                //盤面変化したら最初に戻って定石Aから
                if (Utility.IsChangeBoard(candidateMat, bufferMatrix))
                {
                    //Utility.CandidateOutput(candidateMat);
                    continue;
                }

                //処理前盤面記憶
                Utility.CopyToBufferMatrix(candidateMat, bufferMatrix);

                //●●●●定石C●●●●//
                logics[2](boardMatrix, candidateMat);

                //完成時強制終了
                if (Utility.IsCompleteBoard(boardMatrix))
                {
                    break;
                }

                //盤面変化したら最初に戻って定石Aから
                if (Utility.IsChangeBoard(candidateMat, bufferMatrix))
                {
                    continue;
                }

                //処理前盤面記憶
                Utility.CopyToBufferMatrix(candidateMat, bufferMatrix);

                //●●●●定石D●●●●//
                logics[3](boardMatrix, candidateMat);

                //完成時強制終了
                if (Utility.IsCompleteBoard(boardMatrix))
                {
                    break;
                }

                //盤面変化したら最初に戻って定石Aから
                if (Utility.IsChangeBoard(candidateMat, bufferMatrix))
                {
                    continue;
                }

                //どれも適用できなかったら処理終了
                break;
            }
            endLabel :;

            Utility.CandidateOutput(candidateMat);


            Console.WriteLine();
            Utility.BoardPrint(boardMatrix);

            if (Utility.IsCompleteBoard(boardMatrix))
            {
                Console.WriteLine("完成!");
            }
            else
            {
                Console.WriteLine("未完成・・・");


                //処理後の盤面に総当たり 袋小路に入ってると総当たりでも完成できない
                //xynum = 0;
                //for (int i = 0; i < Utility.ROW; i++)
                //    for (int j = 0; j < Utility.COL; j++)
                //        dataList[xynum++] = boardMatrix[i][j];

                //CRBE単一使用後に総当たり 確実 CRBE単一で誤入力はしない
                xynum = 0;
                for (int i = 0; i < Utility.ROW; i++)
                {
                    for (int j = 0; j < Utility.COL; j++)
                    {
                        dataList[xynum++] = bufMatrix[i][j];
                    }
                }

                solver.BruteForce(dataList, 0, boardMatrix);

                Utility.BoardPrint(boardMatrix);

                if (!Utility.IsCompleteBoard(boardMatrix))
                {
                    Console.WriteLine("失敗・・・");
                }
            }
            Console.WriteLine("スコア:" + solver.DifficultScore);

            Console.ReadLine();
        }