using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace prob21 { class Program { static string[] SuDoKu = new string[81]; static bool[] IsOriginal = new bool[81]; //是不是題目 static void Main(string[] args) { //輸入 string temp; for (int i = 0; i < 9; i++) { temp = Console.ReadLine(); for (int j = 0; j < temp.Length; j++) { if (temp[j] == '-') SuDoKu[i * 9 + j] = ""; else SuDoKu[i * 9 + j] = temp[j].ToString(); } } //設定IsOriginal for (int i = 0; i < 81; i++) { if (SuDoKu[i].Trim() == "") IsOriginal[i] = false; else IsOriginal[i] = true; } Do(0); //輸出 for (int i = 0; i < 9; i++) { for (int j = 0; j < 9; j++) { Console.Write(SuDoKu[i * 9 + j]); } Console.Write("\n"); } } //遞迴解題 static bool Do(int i) { //檢查是不是題目 while (i < 81 && IsOriginal[i]) i++; //檢查是不是已經解題了 if (i > 80) return true; //從1、2、3…9逐一測試直到成功 for (int j = 1; j <= 9; j++) { //檢查可不可以在這個地方填這個數字 if (Check(i, j.ToString())) { SuDoKu[i] = j.ToString(); //呼叫自己 if (Do(i + 1)) //如果傳回已經解題了,就回傳已經解題了 return true; else //如果傳回需要倒回去,就存空白的值 SuDoKu[i] = ""; } } return false; } static bool Check(int arrayNo, string data) { return CheckRow(arrayNo, data) && CheckColumn(arrayNo, data) && CheckGrid(arrayNo, data); } static bool CheckRow(int arrayNo, string data) { int rowNo = arrayNo / 9; for (int i = 0; i < 9; i++) { if (SuDoKu[i + rowNo * 9] == data && (i + rowNo * 9) != arrayNo) { return false; } } return true; } static bool CheckColumn(int arrayNo, string data) { int colNo = arrayNo % 9; for (int i = 0; i < 9; i++) { if (SuDoKu[i * 9 + colNo] == data && (i * 9 + colNo) != arrayNo) { return false; } } return true; } static bool CheckGrid(int arrayNo, string data) { int gridNo = arrayNo / 27 * 27 + arrayNo % 9 / 3 * 3; for (int i = 0; i < 3; i++) { for (int j = 0; j < 3; j++) { if (SuDoKu[gridNo + i * 9 + j] == data && (gridNo + i * 9 + j) != arrayNo) { return false; } } } return true; } } }