fork download
  1. #include <iostream>
  2.  
  3. using namespace std;
  4.  
  5. typedef struct {
  6. int x;
  7. int y;
  8. }Point;
  9.  
  10. int board[9][9] = { 0, };
  11. int cnt = 0; //board에 0이 입력된 횟수
  12. Point p[162] = { 0, }; // board에 0이 입력된 좌표 저장
  13.  
  14. bool check(int x, int y, int key)
  15. {
  16. for (int i = 0; i < 9; i++)
  17. {
  18. if (board[x][i] == key) return false; //세로 열 확인
  19.  
  20. if (board[i][y] == key) return false; //가로 열 확인
  21. }
  22. for (int i = x / 3 * 3; i < x / 3 * 3 + 3; i++)
  23. for (int j = y / 3 * 3; j < y / 3 * 3 + 3; j++)
  24. if (board[i][j] == key) //한 구역 당 숫자들 중 같은게 있다면
  25. return false;
  26.  
  27. return true;
  28. }
  29.  
  30. void solution(int a)
  31. {
  32. if (a == cnt)
  33. {
  34. for (int i = 0; i < 9; i++)
  35. {
  36. for (int j = 0; j < 9; j++)
  37. cout << board[i][j] << " ";
  38. cout << endl;
  39. }
  40. exit(0); //정상 종료
  41. }
  42.  
  43. for (int j = 1; j < 10; j++)
  44. {
  45. if (!check(p[a].x, p[a].y, j)) continue;
  46.  
  47. board[p[a].x][p[a].y] = j;
  48. solution(a + 1);
  49. board[p[a].x][p[a].y] = 0;
  50. }
  51. }
  52.  
  53. int main(void)
  54. {
  55. for (int i = 0; i < 9; i++)
  56. {
  57. for (int j = 0; j < 9; j++)
  58. {
  59. cin >> board[i][j];
  60.  
  61. if (!board[i][j])
  62. {
  63. p[cnt].x = i; //0이 입력된 x좌표 저장
  64. p[cnt].y = j; //0이 입력된 y좌표 저장
  65. cnt++; //0이 입력된 횟수 증가
  66. }
  67. }
  68. }
  69. solution(0);
  70. return 0;
  71. }
Success #stdin #stdout 0s 4764KB
stdin
0 3 5 4 6 9 2 7 8
7 8 2 1 0 5 6 0 9
0 6 0 2 7 8 1 3 5
3 2 1 0 4 6 8 9 7
8 0 4 9 1 3 5 0 6
5 9 6 8 2 0 4 1 3
9 1 7 6 5 2 0 8 0
6 0 3 7 0 1 9 5 2
2 5 8 3 9 4 7 6 0
stdout
1 3 5 4 6 9 2 7 8 
7 8 2 1 3 5 6 4 9 
4 6 9 2 7 8 1 3 5 
3 2 1 5 4 6 8 9 7 
8 7 4 9 1 3 5 2 6 
5 9 6 8 2 7 4 1 3 
9 1 7 6 5 2 3 8 4 
6 4 3 7 8 1 9 5 2 
2 5 8 3 9 4 7 6 1