fork(1) download
  1. using System;
  2. using System.Collections.Generic;
  3. using System.Linq;
  4. using System.Text;
  5.  
  6. namespace prob21
  7. {
  8. class Program
  9. {
  10. static string[] SuDoKu = new string[81];
  11. static bool[] IsOriginal = new bool[81]; //是不是題目
  12.  
  13. static void Main(string[] args)
  14. {
  15. //輸入
  16. string temp;
  17. for (int i = 0; i < 9; i++)
  18. {
  19. temp = Console.ReadLine();
  20. for (int j = 0; j < temp.Length; j++)
  21. {
  22. if (temp[j] == '-')
  23. SuDoKu[i * 9 + j] = "";
  24. else
  25. SuDoKu[i * 9 + j] = temp[j].ToString();
  26. }
  27. }
  28.  
  29. //設定IsOriginal
  30. for (int i = 0; i < 81; i++)
  31. {
  32. if (SuDoKu[i].Trim() == "")
  33. IsOriginal[i] = false;
  34. else
  35. IsOriginal[i] = true;
  36. }
  37.  
  38. Do(0);
  39.  
  40. //輸出
  41. for (int i = 0; i < 9; i++)
  42. {
  43. for (int j = 0; j < 9; j++)
  44. {
  45. Console.Write(SuDoKu[i * 9 + j]);
  46. }
  47. Console.Write("\n");
  48. }
  49. }
  50.  
  51. //遞迴解題
  52. static bool Do(int i)
  53. {
  54. //檢查是不是題目
  55. while (i < 81 && IsOriginal[i])
  56. i++;
  57. //檢查是不是已經解題了
  58. if (i > 80)
  59. return true;
  60. //從1、2、3…9逐一測試直到成功
  61. for (int j = 1; j <= 9; j++)
  62. {
  63. //檢查可不可以在這個地方填這個數字
  64. if (Check(i, j.ToString()))
  65. {
  66. SuDoKu[i] = j.ToString();
  67. //呼叫自己
  68. if (Do(i + 1)) //如果傳回已經解題了,就回傳已經解題了
  69. return true;
  70. else //如果傳回需要倒回去,就存空白的值
  71. SuDoKu[i] = "";
  72. }
  73. }
  74. return false;
  75. }
  76. static bool Check(int arrayNo, string data)
  77. {
  78. return CheckRow(arrayNo, data) && CheckColumn(arrayNo, data) && CheckGrid(arrayNo, data);
  79. }
  80. static bool CheckRow(int arrayNo, string data)
  81. {
  82. int rowNo = arrayNo / 9;
  83.  
  84. for (int i = 0; i < 9; i++)
  85. {
  86. if (SuDoKu[i + rowNo * 9] == data && (i + rowNo * 9) != arrayNo)
  87. {
  88. return false;
  89. }
  90. }
  91. return true;
  92. }
  93. static bool CheckColumn(int arrayNo, string data)
  94. {
  95. int colNo = arrayNo % 9;
  96.  
  97. for (int i = 0; i < 9; i++)
  98. {
  99. if (SuDoKu[i * 9 + colNo] == data && (i * 9 + colNo) != arrayNo)
  100. {
  101. return false;
  102. }
  103. }
  104. return true;
  105. }
  106. static bool CheckGrid(int arrayNo, string data)
  107. {
  108. int gridNo = arrayNo / 27 * 27 + arrayNo % 9 / 3 * 3;
  109.  
  110. for (int i = 0; i < 3; i++)
  111. {
  112. for (int j = 0; j < 3; j++)
  113. {
  114. if (SuDoKu[gridNo + i * 9 + j] == data && (gridNo + i * 9 + j) != arrayNo)
  115. {
  116. return false;
  117. }
  118. }
  119. }
  120. return true;
  121. }
  122. }
  123. }
Success #stdin #stdout 0.04s 33880KB
stdin
---26-7-1
68--7--9-
19---45--
82-1---4-
--46-29--
-5---3-28
--93---74
-4--5--36
7-3-18---
stdout
435269781
682571493
197834562
826195347
374682915
951743628
519326874
248957136
763418259