fork download
  1. #include <stdio.h>
  2. #include <string.h>
  3.  
  4. #define MATRIX_ROW (3)
  5. #define MATRIX_COLUMN (3)
  6. #define NUMBER_OF_ROW (9)
  7. #define NUMBER_OF_COLUMN (9)
  8. #define NUMBER_OF_ELEMENTS (9)
  9.  
  10. typedef struct _SUDOKU_CELL
  11. {
  12. int current;
  13. int nCandidates;
  14. int candidates[NUMBER_OF_ELEMENTS + 1];
  15. } SUDOKU_CELL;
  16.  
  17. typedef struct _SUDOKU_PLANE
  18. {
  19. int unsolved;
  20. SUDOKU_CELL cell[NUMBER_OF_ROW][NUMBER_OF_COLUMN];
  21. } SUDOKU_PLANE;
  22.  
  23. void Reset_SudokuPlane(SUDOKU_PLANE *plane)
  24. {
  25. int i = 0,j = 0,k = 0;
  26. memset(plane,0,sizeof(SUDOKU_PLANE));
  27. plane->unsolved = NUMBER_OF_ELEMENTS * NUMBER_OF_ELEMENTS;
  28. for(i = 0;i < NUMBER_OF_ROW;++i)
  29. {
  30. for(j = 0;j < NUMBER_OF_COLUMN;++j)
  31. {
  32. plane->cell[i][j].nCandidates = NUMBER_OF_ELEMENTS;
  33. for(k = 1;k <= NUMBER_OF_ELEMENTS;++k)
  34. {
  35. plane->cell[i][j].candidates[k] = 1;
  36. }
  37. }
  38. }
  39. return;
  40. }
  41.  
  42. void Input_SudokuCell(SUDOKU_CELL cell[NUMBER_OF_ROW][NUMBER_OF_COLUMN],int rIndex,int cIndex,int n)
  43. {
  44. int i = 0,j = 0;
  45. int rBase = 0,cBase = 0;
  46. if (cell[rIndex][cIndex].current || n == 0)
  47. return;
  48. rBase = MATRIX_ROW * (rIndex / MATRIX_ROW);
  49. cBase = MATRIX_COLUMN * (cIndex / MATRIX_COLUMN);
  50. cell[rIndex][cIndex].current = n;
  51. cell[rIndex][cIndex].nCandidates = 1;
  52. memset(cell[rIndex][cIndex].candidates,0,sizeof(int)*(NUMBER_OF_ELEMENTS + 1));
  53. cell[rIndex][cIndex].candidates[n] = 1;
  54. for(i = 0;i < NUMBER_OF_ROW;++i)
  55. {
  56. if (i == rIndex)
  57. continue;
  58. if (cell[i][cIndex].candidates[n])
  59. {
  60. cell[i][cIndex].candidates[n] = 0;
  61. cell[i][cIndex].nCandidates -= 1;
  62. }
  63. }
  64. for(i = 0;i < NUMBER_OF_COLUMN;++i)
  65. {
  66. if (i == cIndex)
  67. continue;
  68. if (cell[rIndex][i].candidates[n])
  69. {
  70. cell[rIndex][i].candidates[n] = 0;
  71. cell[rIndex][i].nCandidates -= 1;
  72. }
  73. }
  74. for(i = 0;i < MATRIX_ROW;++i)
  75. {
  76. for(j = 0;j < MATRIX_COLUMN;++j)
  77. {
  78. if (((rBase + i) == rIndex) && ((cBase + j) == cIndex))
  79. continue;
  80. if (cell[rBase + i][cBase + j].candidates[n])
  81. {
  82. cell[rBase + i][cBase + j].candidates[n] = 0;
  83. cell[rBase + i][cBase + j].nCandidates -= 1;
  84. }
  85. }
  86. }
  87. return;
  88. }
  89.  
  90. void Input_SudokuPlane(SUDOKU_PLANE *plane)
  91. {
  92. int i = 0,j = 0;
  93. int cnt = 0;
  94. int n[NUMBER_OF_COLUMN] = {0};
  95. static char * const format = "%d,%d,%d,%d,%d,%d,%d,%d,%d";
  96. for(i = 0;i < NUMBER_OF_ROW;++i)
  97. {
  98. cnt +=
  99. stdin,
  100. format,
  101. &n[0],
  102. &n[1],
  103. &n[2],
  104. &n[3],
  105. &n[4],
  106. &n[5],
  107. &n[6],
  108. &n[7],
  109. &n[8]);
  110. for(j = 0;j < NUMBER_OF_COLUMN;++j)
  111. {
  112. if (n[j])
  113. {
  114. Input_SudokuCell(plane->cell,i,j,n[j]);
  115. plane->unsolved -= 1;
  116. }
  117. }
  118. }
  119. return;
  120. }
  121.  
  122. void Show_SudokuPlane(SUDOKU_PLANE *plane)
  123. {
  124. int i = 0,j = 0,k = 0;
  125. for(i = 0;i < NUMBER_OF_ROW;++i)
  126. {
  127. fprintf(stdout,"\n");
  128. if (i % MATRIX_ROW == 0)
  129. {
  130. fprintf(stdout,"+");
  131. for(k = 0;k < (NUMBER_OF_COLUMN/MATRIX_COLUMN);++k)
  132. {
  133. for(j = 0;j < MATRIX_COLUMN;++j)
  134. fprintf(stdout,"---");
  135. fprintf(stdout,"+");
  136. }
  137. fprintf(stdout,"\n");
  138. }
  139. for(j = 0;j < NUMBER_OF_COLUMN;++j)
  140. {
  141. if (j == 0)
  142. fprintf(stdout,"|");
  143. if (plane->cell[i][j].current)
  144. fprintf(stdout," %d ",plane->cell[i][j]);
  145. else
  146. fprintf(stdout," ");
  147. if ((j + 1) % MATRIX_COLUMN == 0)
  148. fprintf(stdout,"|");
  149. }
  150. }
  151. fprintf(stdout,"\n");
  152. fprintf(stdout,"+");
  153. for(k = 0;k < (NUMBER_OF_COLUMN/MATRIX_COLUMN);++k)
  154. {
  155. for(j = 0;j < MATRIX_COLUMN;++j)
  156. fprintf(stdout,"---");
  157. fprintf(stdout,"+");
  158. }
  159. fprintf(stdout,"\n");
  160. return;
  161. }
  162.  
  163. int method1(SUDOKU_PLANE *plane)
  164. {
  165. int i = 0,j = 0,k = 0;
  166. int n = 0;
  167. for(i = 0;i < NUMBER_OF_ROW;++i)
  168. {
  169. for(j = 0;j < NUMBER_OF_COLUMN;++j)
  170. {
  171. if (plane->cell[i][j].current == 0 && plane->cell[i][j].nCandidates == 1)
  172. {
  173. ++n;
  174. for(k = 1;k <= NUMBER_OF_ELEMENTS;++k)
  175. {
  176. if (plane->cell[i][j].candidates[k])
  177. {
  178. Input_SudokuCell(plane->cell,i,j,k);
  179. plane->unsolved -= 1;
  180. break;
  181. }
  182. }
  183. }
  184. }
  185. }
  186. return n;
  187. }
  188.  
  189. int find_cell_with_value(SUDOKU_CELL cell[NUMBER_OF_ROW][NUMBER_OF_COLUMN],int rIndex,int cIndex,int n,int left,int top,int width,int height,int *row,int *col)
  190. {
  191. int i = 0,j = 0;
  192. int find = 0;
  193. for(i = 0;i < height;++i)
  194. {
  195. for(j = 0;j < width;++j)
  196. {
  197. if (((top + i) == rIndex) && ((left + j) == cIndex))
  198. continue;
  199. if (cell[top + i][left + j].current == 0 && cell[top + i][left + j].candidates[n])
  200. {
  201. find = 1;
  202. if (row)
  203. *row = top + i;
  204. if (col)
  205. *col = left + j;
  206. goto _find;
  207. }
  208. }
  209. }
  210. _find:
  211. return find;
  212. }
  213.  
  214. int method2(SUDOKU_PLANE *plane)
  215. {
  216. int i = 0,j = 0,k = 0;
  217. int n = 0;
  218. int rBase = 0,cBase = 0;
  219. for(i = 0;i < NUMBER_OF_ROW;++i)
  220. {
  221. for(j = 0;j < NUMBER_OF_COLUMN;++j)
  222. {
  223. rBase = MATRIX_ROW * (i / MATRIX_ROW);
  224. cBase = MATRIX_COLUMN * (j / MATRIX_COLUMN);
  225. if (plane->cell[i][j].current == 0)
  226. {
  227. for(k = 1;k <= NUMBER_OF_ELEMENTS;++k)
  228. {
  229. if (plane->cell[i][j].candidates[k])
  230. {
  231. if (!find_cell_with_value(plane->cell,i,j,k,0,i,NUMBER_OF_COLUMN,1,NULL,NULL))
  232. {
  233. ++n;
  234. Input_SudokuCell(plane->cell,i,j,k);
  235. plane->unsolved -= 1;
  236. break;
  237. }
  238. else if (!find_cell_with_value(plane->cell,i,j,k,j,0,1,NUMBER_OF_ROW,NULL,NULL))
  239. {
  240. ++n;
  241. Input_SudokuCell(plane->cell,i,j,k);
  242. plane->unsolved -= 1;
  243. break;
  244. }
  245. else if (!find_cell_with_value(plane->cell,i,j,k,cBase,rBase,MATRIX_COLUMN,MATRIX_ROW,NULL,NULL))
  246. {
  247. ++n;
  248. Input_SudokuCell(plane->cell,i,j,k);
  249. plane->unsolved -= 1;
  250. break;
  251. }
  252. }
  253. }
  254. }
  255. }
  256. }
  257. return n;
  258. }
  259.  
  260. int find_nset(SUDOKU_CELL cell[NUMBER_OF_ROW][NUMBER_OF_COLUMN],int rIndex,int cIndex,int left,int top,int width,int height,char f[NUMBER_OF_ROW][NUMBER_OF_COLUMN])
  261. {
  262. int i = 0,j = 0;
  263. int n = 0;
  264. memset(f,0,sizeof(char)*(NUMBER_OF_ROW * NUMBER_OF_COLUMN));
  265. for(i = 0;i < height;i++)
  266. {
  267. for(j = 0;j < width;++j)
  268. {
  269. if (((top + i) == rIndex) && ((left + j) == cIndex))
  270. continue;
  271. if (cell[top + i][left + j].current == 0 &&
  272. !memcmp(cell[rIndex][cIndex].candidates,cell[top + i][left + j].candidates,sizeof(int)*(NUMBER_OF_ELEMENTS + 1)))
  273. {
  274. ++n;
  275. f[top + i][left + j] = 1;
  276. }
  277. }
  278. }
  279. ++n;
  280. return n;
  281. }
  282.  
  283. int method3(SUDOKU_PLANE *plane)
  284. {
  285. int i = 0,j = 0,k = 0,l = 0,m = 0;
  286. int rBase = 0,cBase = 0;
  287. int n = 0;
  288. char f[NUMBER_OF_ROW][NUMBER_OF_COLUMN] = {0};
  289. for(i = 0;i < NUMBER_OF_ROW;++i)
  290. {
  291. for(j = 0;j < NUMBER_OF_COLUMN;++j)
  292. {
  293. rBase = MATRIX_ROW * (i / MATRIX_ROW);
  294. cBase = MATRIX_COLUMN * (j / MATRIX_COLUMN);
  295. if (plane->cell[i][j].current == 0)
  296. {
  297. if (plane->cell[i][j].nCandidates == find_nset(plane->cell,i,j,0,i,NUMBER_OF_COLUMN,1,f))
  298. {
  299. ++n;
  300. for(k = 1;k <= NUMBER_OF_ELEMENTS;++k)
  301. {
  302. if (plane->cell[i][j].candidates[k])
  303. {
  304. for(l = 0;l < NUMBER_OF_COLUMN;++l)
  305. {
  306. if (l == j)
  307. continue;
  308. if (!f[i][l] && plane->cell[i][l].candidates[k])
  309. {
  310. plane->cell[i][l].candidates[k] = 0;
  311. plane->cell[i][l].nCandidates -= 1;
  312. }
  313. }
  314. }
  315. }
  316. }
  317. if (plane->cell[i][j].nCandidates == find_nset(plane->cell,i,j,j,0,1,NUMBER_OF_ROW,f))
  318. {
  319. ++n;
  320. for(k = 1;k <= NUMBER_OF_ELEMENTS;++k)
  321. {
  322. if (plane->cell[i][j].candidates[k])
  323. {
  324. for(l = 0;l < NUMBER_OF_ROW;++l)
  325. {
  326. if (l == i)
  327. continue;
  328. if (!f[l][j] && plane->cell[l][j].candidates[k])
  329. {
  330. plane->cell[l][j].candidates[k] = 0;
  331. plane->cell[l][j].nCandidates -= 1;
  332. }
  333. }
  334. }
  335. }
  336. }
  337. if (plane->cell[i][j].nCandidates == find_nset(plane->cell,i,j,cBase,rBase,MATRIX_COLUMN,MATRIX_ROW,f))
  338. {
  339. ++n;
  340. for(k = 1;k <= NUMBER_OF_ELEMENTS;++k)
  341. {
  342. if (plane->cell[i][j].candidates[k])
  343. {
  344. for(l = 0;l < MATRIX_ROW;++l)
  345. {
  346. for(m = 0;m < MATRIX_COLUMN;++m)
  347. {
  348. if (((rBase + l) == i) && ((cBase + m) == j))
  349. continue;
  350. if (!f[rBase + l][cBase + m] && plane->cell[rBase + l][cBase + m].candidates[k])
  351. {
  352. plane->cell[rBase + l][cBase + m].candidates[k] = 0;
  353. plane->cell[rBase + l][cBase + m].nCandidates -= 1;
  354. }
  355. }
  356. }
  357. }
  358. }
  359. }
  360. }
  361. }
  362. }
  363. return n;
  364. }
  365.  
  366. int method4_sub1(SUDOKU_CELL cell[NUMBER_OF_ROW][NUMBER_OF_COLUMN],int rIndex)
  367. {
  368. int i = 0,j = 0,k = 0;
  369. int rBase = 0,cBase = 0;
  370. int n = 0;
  371. const int nBlock = (NUMBER_OF_ROW / MATRIX_ROW) * (NUMBER_OF_COLUMN / MATRIX_COLUMN);
  372. int nHitBlock = 0;
  373. int block[(NUMBER_OF_ROW / MATRIX_ROW) * (NUMBER_OF_COLUMN / MATRIX_COLUMN)] = {0};
  374. for(k = 1;k <= NUMBER_OF_ELEMENTS;++k)
  375. {
  376. nHitBlock = 0;
  377. memset(block,0,sizeof(int)*nBlock);
  378. for(i = 0;i < NUMBER_OF_COLUMN;++i)
  379. {
  380. if (cell[rIndex][i].current == 0 && cell[rIndex][i].candidates[k])
  381. {
  382. if (block[MATRIX_ROW*(rIndex / MATRIX_ROW) + (i / MATRIX_COLUMN)] == 0)
  383. block[MATRIX_ROW*(rIndex / MATRIX_ROW) + (i / MATRIX_COLUMN)] += 1;
  384. }
  385. }
  386. for(i = 0; i< nBlock;++i)
  387. nHitBlock += block[i];
  388. if (nHitBlock == 1)
  389. {
  390. for(i = 0;i < nBlock;++i)
  391. {
  392. if (block[i])
  393. {
  394. rBase = MATRIX_ROW * (i / MATRIX_ROW);
  395. cBase = MATRIX_COLUMN * (i % MATRIX_ROW);
  396. for(i = 0;i < MATRIX_ROW;++i)
  397. {
  398. for(j = 0;j < MATRIX_COLUMN;++j)
  399. {
  400. if ((rBase + i) == rIndex)
  401. continue;
  402. if (cell[rBase + i][cBase + j].current == 0 &&
  403. cell[rBase + i][cBase + j].candidates[k])
  404. {
  405. ++n;
  406. cell[rBase + i][cBase + j].candidates[k] = 0;
  407. cell[rBase + i][cBase + j].nCandidates -= 1;
  408. }
  409. }
  410. }
  411. break;
  412. }
  413. }
  414. }
  415. }
  416. return n;
  417. }
  418.  
  419. int method4_sub2(SUDOKU_CELL cell[NUMBER_OF_ROW][NUMBER_OF_COLUMN],int cIndex)
  420. {
  421. int i = 0,j = 0,k = 0;
  422. int rBase = 0,cBase = 0;
  423. int n = 0;
  424. const int nBlock = (NUMBER_OF_ROW / MATRIX_ROW) * (NUMBER_OF_COLUMN / MATRIX_COLUMN);
  425. int block[(NUMBER_OF_ROW / MATRIX_ROW) * (NUMBER_OF_COLUMN / MATRIX_COLUMN)] = {0};
  426. int nHitBlock = 0;
  427. for(k = 1;k <= NUMBER_OF_ELEMENTS;++k)
  428. {
  429. nHitBlock = 0;
  430. memset(block,0,sizeof(int)*nBlock);
  431. for(i = 0;i < NUMBER_OF_ROW;++i)
  432. {
  433. if (cell[i][cIndex].current == 0 && cell[i][cIndex].candidates[k])
  434. {
  435. if (block[MATRIX_ROW*(i / MATRIX_ROW) + (cIndex / MATRIX_COLUMN)] == 0)
  436. block[MATRIX_ROW*(i / MATRIX_ROW) + (cIndex / MATRIX_COLUMN)] += 1;
  437. }
  438. }
  439. for(i = 0;i < nBlock;++i)
  440. {
  441. nHitBlock += block[i];
  442. }
  443. if (nHitBlock == 1)
  444. {
  445. for(i = 0;i < nBlock;++i)
  446. {
  447. if (block[i])
  448. {
  449. rBase = MATRIX_ROW * (i / MATRIX_ROW);
  450. cBase = MATRIX_COLUMN * (i % MATRIX_ROW);
  451. for(i = 0;i < MATRIX_ROW;++i)
  452. {
  453. for(j = 0;j < MATRIX_COLUMN;++j)
  454. {
  455. if ((cBase + j) == cIndex)
  456. continue;
  457. if (cell[rBase + i][cBase + j].current == 0 &&
  458. cell[rBase + i][cBase + j].candidates[k])
  459. {
  460. ++n;
  461. cell[rBase + i][cBase + j].candidates[k] = 0;
  462. cell[rBase + i][cBase + j].nCandidates -= 1;
  463. }
  464. }
  465. }
  466. break;
  467. }
  468. }
  469. }
  470. }
  471. return n;
  472. }
  473.  
  474. int method4_sub3(SUDOKU_CELL cell[NUMBER_OF_ROW][NUMBER_OF_COLUMN],int rIndex,int cIndex)
  475. {
  476. int i = 0,j = 0,k = 0;
  477. int rBase = 0,cBase = 0;
  478. int n = 0;
  479. int row[NUMBER_OF_ROW] = {0};
  480. int column[NUMBER_OF_COLUMN] = {0};
  481. int nHitRow = 0;
  482. int nHitColumn = 0;
  483. for(k = 1;k <= NUMBER_OF_ELEMENTS;++k)
  484. {
  485. nHitRow = 0;
  486. nHitColumn = 0;
  487. memset(row,0,sizeof(row));
  488. memset(column,0,sizeof(column));
  489. rBase = MATRIX_ROW * (rIndex / MATRIX_ROW);
  490. cBase = MATRIX_COLUMN * (cIndex / MATRIX_COLUMN);
  491. for(i = 0;i < MATRIX_ROW;++i)
  492. {
  493. for(j = 0;j < MATRIX_COLUMN;++j)
  494. {
  495. if (cell[rBase + i][cBase + j].current == 0 &&
  496. cell[rBase + i][cBase + j].candidates[k])
  497. {
  498. if (row[rBase + i] == 0)
  499. {
  500. row[rBase + i] += 1;
  501. }
  502. if (column[cBase + j] == 0)
  503. {
  504. column[cBase + j] += 1;
  505. }
  506. }
  507. }
  508. }
  509. for(i = 0;i < NUMBER_OF_ROW;++i)
  510. nHitRow += row[i];
  511. for(i = 0;i < NUMBER_OF_COLUMN;++i)
  512. nHitColumn += column[i];
  513. if (nHitRow == 1)
  514. {
  515. for(i = 0;i < NUMBER_OF_ROW;++i)
  516. {
  517. if (row[i])
  518. {
  519. for(j = 0;j < NUMBER_OF_COLUMN;++j)
  520. {
  521. if (cBase <= j && j < (cBase + MATRIX_COLUMN))
  522. continue;
  523. if (cell[i][j].current == 0 && cell[i][j].candidates[k])
  524. {
  525. ++n;
  526. cell[i][j].candidates[k] = 0;
  527. cell[i][j].nCandidates -= 1;
  528. }
  529. }
  530. break;
  531. }
  532. }
  533. }
  534. else if (nHitColumn == 1)
  535. {
  536. for(j = 0;j < NUMBER_OF_COLUMN;++j)
  537. {
  538. if (column[j])
  539. {
  540. for(i = 0;i < NUMBER_OF_ROW;++i)
  541. {
  542. if (rBase <= i && i < (rBase + MATRIX_ROW))
  543. continue;
  544. if (cell[i][j].current == 0 && cell[i][j].candidates[k])
  545. {
  546. ++n;
  547. cell[i][j].candidates[k] = 0;
  548. cell[i][j].nCandidates -= 1;
  549. }
  550. }
  551. break;
  552. }
  553. }
  554. }
  555. }
  556. return n;
  557. }
  558.  
  559. int method4(SUDOKU_PLANE *plane)
  560. {
  561. int i = 0,j = 0;
  562. int n = 0;
  563. for(i = 0;i < NUMBER_OF_ROW;++i)
  564. {
  565. n += method4_sub1(plane->cell,i);
  566. }
  567. for(i = 0;i < NUMBER_OF_COLUMN;++i)
  568. {
  569. n += method4_sub2(plane->cell,i);
  570. }
  571. for(i = 0;i < MATRIX_ROW;++i)
  572. {
  573. for(j = 0;j < MATRIX_COLUMN;++j)
  574. {
  575. n += method4_sub3(plane->cell,MATRIX_ROW*i,MATRIX_COLUMN*j);
  576. }
  577. }
  578. return n;
  579. }
  580.  
  581. int Solve_SudokuPlane(SUDOKU_PLANE *plane)
  582. {
  583. int cnt = 0;
  584. while(plane->unsolved)
  585. {
  586. for(;;)
  587. {
  588. if (!method1(plane))
  589. break;
  590. }
  591. for(;;)
  592. {
  593. if (!method2(plane))
  594. break;
  595. }
  596. method3(plane);
  597. method4(plane);
  598. if (++cnt > 800)
  599. break;
  600. }
  601. return (plane->unsolved == 0);
  602. }
  603.  
  604. int isSolved(SUDOKU_PLANE *plane)
  605. {
  606. return (plane->unsolved == 0);
  607. }
  608.  
  609. int main(int argc,char **argv)
  610. {
  611. SUDOKU_PLANE plane;
  612. Reset_SudokuPlane(&plane);
  613. Input_SudokuPlane(&plane);
  614. Show_SudokuPlane(&plane);
  615. fprintf(stdout,"Thinking... Please wait...\n");
  616. Solve_SudokuPlane(&plane);
  617. Show_SudokuPlane(&plane);
  618. if (!isSolved(&plane))
  619. {
  620. fprintf(stdout,"Sorry but, I cannot solve this Sudoku...\n");
  621. fprintf(stdout,"It is difficult for me to solve this Sudoku !\n");
  622. }
  623. return 0;
  624. }
  625.  
Success #stdin #stdout 0.05s 2048KB
stdin
0,0,9,5,0,3,1,0,0
0,7,1,0,0,0,9,6,0
3,4,0,0,0,0,0,2,5
0,0,0,1,0,4,0,0,0
0,0,3,8,0,9,2,0,0
0,9,0,0,0,0,0,1,0
0,1,5,9,0,2,7,3,0
0,0,0,3,0,6,0,0,0
0,0,0,0,0,0,0,0,0
stdout
+---------+---------+---------+
|       9 | 5     3 | 1       |
|    7  1 |         | 9  6    |
| 3  4    |         |    2  5 |
+---------+---------+---------+
|         | 1     4 |         |
|         | 8     9 | 2       |
|    9    |         |    1    |
+---------+---------+---------+
|    1  5 | 9     2 | 7  3    |
|         | 3     6 |         |
|         |         |         |
+---------+---------+---------+

Thinking... Please wait...
Sorry but, I cannot solve this Sudoku...
It is difficult for me to solve this Sudoku !
Entering Brute-force mode...

1 th solution:

+---------+---------+---------+
| 8  2  9 | 5  6  3 | 1  4  7 |
| 5  7  1 | 2  4  8 | 9  6  3 |
| 3  4  6 | 7  9  1 | 8  2  5 |
+---------+---------+---------+
| 2  6  8 | 1  7  4 | 3  5  9 |
| 1  5  4 | 8  3  9 | 2  7  6 |
| 7  9  3 | 6  2  5 | 4  1  8 |
+---------+---------+---------+
| 6  1  5 | 9  8  2 | 7  3  4 |
| 4  8  7 | 3  1  6 | 5  9  2 |
| 9  3  2 | 4  5  7 | 6  8  1 |
+---------+---------+---------+
2 th solution:

+---------+---------+---------+
| 8  2  9 | 5  6  3 | 1  4  7 |
| 5  7  1 | 2  4  8 | 9  6  3 |
| 3  4  6 | 7  9  1 | 8  2  5 |
+---------+---------+---------+
| 7  6  8 | 1  2  4 | 3  5  9 |
| 1  5  4 | 8  3  9 | 2  7  6 |
| 2  9  3 | 6  5  7 | 4  1  8 |
+---------+---------+---------+
| 6  1  5 | 9  8  2 | 7  3  4 |
| 4  8  7 | 3  1  6 | 5  9  2 |
| 9  3  2 | 4  7  5 | 6  8  1 |
+---------+---------+---------+
3 th solution:

+---------+---------+---------+
| 8  2  9 | 5  6  3 | 1  4  7 |
| 5  7  1 | 2  4  8 | 9  6  3 |
| 3  4  6 | 7  9  1 | 8  2  5 |
+---------+---------+---------+
| 7  6  8 | 1  2  4 | 3  5  9 |
| 1  5  4 | 8  3  9 | 2  7  6 |
| 2  9  3 | 6  7  5 | 4  1  8 |
+---------+---------+---------+
| 6  1  5 | 9  8  2 | 7  3  4 |
| 4  8  7 | 3  1  6 | 5  9  2 |
| 9  3  2 | 4  5  7 | 6  8  1 |
+---------+---------+---------+
4 th solution:

+---------+---------+---------+
| 2  8  9 | 5  6  3 | 1  4  7 |
| 5  7  1 | 2  4  8 | 9  6  3 |
| 3  4  6 | 7  9  1 | 8  2  5 |
+---------+---------+---------+
| 8  5  2 | 1  3  4 | 6  7  9 |
| 1  6  3 | 8  7  9 | 2  5  4 |
| 7  9  4 | 6  2  5 | 3  1  8 |
+---------+---------+---------+
| 4  1  5 | 9  8  2 | 7  3  6 |
| 9  2  7 | 3  5  6 | 4  8  1 |
| 6  3  8 | 4  1  7 | 5  9  2 |
+---------+---------+---------+
5 th solution:

+---------+---------+---------+
| 8  2  9 | 5  6  3 | 1  4  7 |
| 5  7  1 | 2  4  8 | 9  6  3 |
| 3  4  6 | 7  9  1 | 8  2  5 |
+---------+---------+---------+
| 7  6  8 | 1  2  4 | 3  5  9 |
| 1  5  4 | 8  3  9 | 2  7  6 |
| 2  9  3 | 6  5  7 | 4  1  8 |
+---------+---------+---------+
| 6  1  5 | 9  8  2 | 7  3  4 |
| 4  8  2 | 3  7  6 | 5  9  1 |
| 9  3  7 | 4  1  5 | 6  8  2 |
+---------+---------+---------+
This Sudoku has 5 solution.