fork download
  1. #include <stdio.h>
  2. #include <string.h>
  3. #include <memory.h>
  4. #define ArSize(XX) (sizeof(XX)/sizeof(XX[0]))
  5.  
  6. int b_map[9][9],ans_cnt,left_cnt;
  7. int b_garo[9][10],b_sero[9][10],b_caan[9][10];
  8. char sp_pzl[][81]={\
  9. ".................................................................................",\
  10. "52...6.........7.13...........4..8..6......5...........418.........3..2...87.....",\
  11. "6.....8.3.4.7.................5.4.7.3..2.....1.6.......2.....5.....8.6......1....",\
  12. ".6.5.1.9.1...9..539....7....4.8...7.......5.8.817.5.3.....5.2............76..8..."};
  13.  
  14. void pr_pzl(int b_pzl[9][9]) {
  15. int i,j;
  16. puts("");
  17. for(i=0 ; i<9 ; ++i) {
  18. for(j=0 ; j<9 ; ++j) {
  19. printf("%d",b_pzl[i][j]);
  20. if(j==2 || j==5) printf("|");
  21. }
  22. puts("");
  23. if(i==2 || i==5) puts("---+---+---");
  24. }
  25. puts("");
  26. }
  27.  
  28. int sfs_rdy(char *pzl) {
  29. int i,j,xx;
  30. ans_cnt=left_cnt=0;
  31. memset(b_map,0,sizeof b_map);
  32. memset(b_garo,0,sizeof b_garo);
  33. memset(b_sero,0,sizeof b_sero);
  34. memset(b_caan,0,sizeof b_caan);
  35. for(i=0 ; i<81 ; ++i) {
  36. if(pzl[i]>='0' && pzl[i]<='9') {
  37. b_map[i/9][i%9]=pzl[i]-'0';
  38. } else if(pzl[i]=='.') {
  39. b_map[i/9][i%9]=0;
  40. } else return -1;
  41. }
  42. for(i=0 ; i<9 ; ++i) {
  43. for(j=0 ; j<9 ;++j) {
  44. if(!(xx=b_map[i][j])) ++left_cnt;
  45. else if(b_garo[i][xx]||b_sero[j][xx]||b_caan[i/3*3+j/3][xx]) return -1;
  46. else {
  47. b_garo[i][xx]=1;
  48. b_sero[j][xx]=1;
  49. b_caan[i/3*3+j/3][xx]=1;
  50. }
  51. }
  52. }
  53. puts("Input puzzle : ");
  54. pr_pzl(b_map);
  55. return 0;
  56. }
  57.  
  58. int pr_dab() {
  59. pr_pzl(b_map);
  60. if(++ans_cnt>1) {
  61. puts("Too many answers.");
  62. return -1;
  63. }
  64. return 0;
  65. }
  66.  
  67. int sfs_slv(int rline) {
  68. int i,j,k;
  69. if(left_cnt==0) return pr_dab();
  70. for(i=rline ; i<9 ; ++i) {
  71. for(j=0 ; j<9 ; ++j) {
  72. if(b_map[i][j]==0) break;
  73. }
  74. if(j<9) break;
  75. }
  76. if(i==9&&j==9) return -2;
  77. for(k=1 ; k<=9 ; ++k) {
  78. b_map[i][j]=k;
  79. if(b_garo[i][k]||b_sero[j][k]||b_caan[i/3*3+j/3][k]) continue;
  80. else {
  81. b_garo[i][k]=1;
  82. b_sero[j][k]=1;
  83. b_caan[i/3*3+j/3][k]=1;
  84. --left_cnt;
  85. if(sfs_slv(i)!=0) return -1;
  86. ++left_cnt;
  87. b_garo[i][k]=0;
  88. b_sero[j][k]=0;
  89. b_caan[i/3*3+j/3][k]=0;
  90. }
  91. }
  92. b_map[i][j]=0;
  93. return 0;
  94. }
  95.  
  96.  
  97. int main(int argc,char **argv) {
  98. int i;
  99. for(i=0 ; i<ArSize(sp_pzl) ; ++i) {
  100. if(sfs_rdy(sp_pzl[i])!=0) {
  101. puts("Wrong puzzle!!");
  102. continue;
  103. }
  104. puts("Solving...");
  105. sfs_slv(0);
  106. puts("Solved.\n");
  107. }
  108. return 0;
  109. }
Success #stdin #stdout 0.72s 1720KB
stdin
Standard input is empty
stdout
Input puzzle : 

000|000|000
000|000|000
000|000|000
---+---+---
000|000|000
000|000|000
000|000|000
---+---+---
000|000|000
000|000|000
000|000|000

Solving...

123|456|789
456|789|123
789|123|456
---+---+---
214|365|897
365|897|214
897|214|365
---+---+---
531|642|978
642|978|531
978|531|642


123|456|789
456|789|123
789|123|456
---+---+---
214|365|897
365|897|214
897|214|365
---+---+---
531|642|978
648|971|532
972|538|641

Too many answers.
Solved.

Input puzzle : 

520|006|000
000|000|701
300|000|000
---+---+---
000|400|800
600|000|050
000|000|000
---+---+---
041|800|000
000|030|020
008|700|000

Solving...

527|316|489
896|542|731
314|987|562
---+---+---
172|453|896
689|271|354
453|698|217
---+---+---
941|825|673
765|134|928
238|769|145

Solved.

Input puzzle : 

600|000|803
040|700|000
000|000|000
---+---+---
000|504|070
300|200|000
106|000|000
---+---+---
020|000|050
000|080|600
000|010|000

Solving...

617|459|823
248|736|915
539|128|467
---+---+---
982|564|371
374|291|586
156|873|294
---+---+---
823|647|159
791|385|642
465|912|738

Solved.

Input puzzle : 

060|501|090
100|090|053
900|007|000
---+---+---
040|800|070
000|000|508
081|705|030
---+---+---
000|050|200
000|000|000
076|008|000

Solving...

863|521|794
127|496|853
954|387|621
---+---+---
645|839|172
739|142|568
281|765|439
---+---+---
498|653|217
512|974|386
376|218|945

Solved.