Programming the beauty of the first chapter of the 15th section, talking about the construction of Sudoku, a start to get this problem really no idea, but read the book in the introduction, found that the original solution of the idea and the N queen problem is consistent, but do not know why, anyway, at first did not think of this backtracking method, know that is solved by backtracking, The problem becomes much easier.
Here we do not intend to implement the construction of Sudoku, instead, we implement a Sudoku Solver, and MOM will no longer have to worry about my sudoku.
Of course, the idea of solver and construction of the idea of Sudoku, are backtracking search, there is no longer too much to explain.
Program Run Instructions:
1. Place the Sudoku data to be solved in the In.txt file, and the program will automatically read it and output the solution to the screen and the OUT.txt file.
2. Console color change using the Setconsoletextattribute function, use details can refer to C/C + + to change the console output font background and color (Windows)
3. For program run time statistics, use GetTickCount () or clock () can be
The results are as follows:
The red indicates that the part is the solved value >_<~~
By convention, the following is the source code:
//================ "Shudu.h" ===========#pragma once#Define N 9#include <fstream>typedefstruct_searchnode {intRowintColintdata;} Searchnode;class cshudu{ Public:Cshudu(); ~cshudu ();voidCreatesolution ();Private:BOOL IsOK(intRowintCOL);voidSolveintSEARCHNODE_ID);voidWriteFile (intID);voidDisplayintID);voidInitshudu ();voidOutputintID);Private:intM_shudu[n + 2][n + 1];BOOLM_find;intm_solution_id; Std::fstream outfile; Searchnode m_searchnode[n * N];intM_searchlength;};
//===================== "Shudu.cpp" ==================#include <windows.h>#include "ShuDu.h"#include <stdio.h>#include <string.h>#include <fstream>#include <iostream>Cshudu::cshudu () {memset(M_shudu,0,sizeof(M_shudu)); M_find =false; m_solution_id =0; Outfile.open ("OUT.txt",STD:: Ios::out); M_searchlength =0;memset(M_searchnode,0,sizeof(M_searchnode));} Cshudu::~cshudu () {outfile.close ();}voidCshudu::createsolution () {Initshudu (); Solve1);}BOOLCshudu::isok (intRowintCol) {BOOLIsOK =true;//Column Direction detection for(inti =1; I! =Ten; i++) {if(i = = row)Continue; IsOK = (M_shudu[i][col] = = M_shudu[row][col])?false:true;if(IsOK = =false)returnIsOK; }//Line detection for(inti =1; I! =Ten; i++) {if(i = = col)Continue; IsOK = (M_shudu[row][i] = = M_shudu[row][col])?false:true;if(IsOK = =false)returnIsOK; }//Zone detection intBlock_start_row = (Row-1) /3*3+1;intBlock_start_col = (Col-1) /3*3+1; for(inti = Block_start_row; I! = Block_start_row +3; i++) { for(intj = Block_start_col; J! = Block_start_col +3; J + +) {if(i = = Row && j = = col)Continue; IsOK = (M_shudu[i][j] = = M_shudu[row][col])?false:true;if(IsOK = =false)returnIsOK; } }returnIsOK;}voidCshudu::solve (intSEARCHNODE_ID) {if(M_find = =true)return;if(M_searchlength +1= = searchnode_id) {//m_find = true;m_solution_id++; Output (m_solution_id);return; } for(inti =1; I! =Ten; i++) {introw = M_searchnode[searchnode_id].row;intcol = M_searchnode[searchnode_id].col; M_shudu[row][col] = i;if(IsOK (Row, col)) {Solve (searchnode_id +1); row = m_searchnode[searchnode_id +1].row; Col = m_searchnode[searchnode_id +1].col; M_shudu[row][col] =0; } }}voidCshudu::d isplay (intID) {STD::cout<<"=========================== First"<< ID <<"Group Sudoku data ============================="<<STD:: Endl; System"title Sudoku Solver by zhyh2010 version 1.0");intsearch_id =1; HANDLE HANDLE = GetStdHandle (Std_output_handle); for(inti =1; I! =Ten; i++) { for(intj =1; J! =Ten; J + +) {if(i = = M_searchnode[search_id].row && j = = M_searchnode[search_id].col) {Setconsoletextattribute (handle, Foreground_intensity | foreground_red); search_id++; }ElseSetconsoletextattribute (Handle, Foreground_intensity | foreground_red | Foreground_blue | Foreground_green);STD::cout<< M_shudu[i][j] <<" "; }STD::cout<<STD:: Endl; }STD::cout<<STD:: Endl;STD::cout<<STD:: Endl; Setconsoletextattribute (handle, foreground_intensity);}voidCshudu::writefile (intID) {outfile <<"=========================== First"<< ID <<"Group Sudoku data ============================="<<STD:: Endl; for(inti =1; I! =Ten; i++) { for(intj =1; J! =Ten; J + +) {outfile << m_shudu[i][j] <<" "; } outfile <<STD:: Endl; } outfile <<STD:: Endl; OutFile <<STD:: Endl;}voidCshudu::output (intID) {display (ID); WriteFile (ID);//getchar ();}voidCshudu::initshudu () {STD:: Ifstream infile ("In.txt"); for(inti =1; I! =Ten; i++) { for(intj =1; J! =Ten; J + +) {infile >> m_shudu[i][j];if(M_shudu[i][j] = =0) {m_searchlength++; M_searchnode[m_searchlength].row = i; M_searchnode[m_searchlength].col = j; } } }}
//===================== "Sudoku Solver main.cpp" ==================//@ author:zhyh2010//@ date:20150624//@ version:1.0//@ description:c++//===================== "Sudoku Solver" ==================#include <stdio.h>#include "ShuDu.h"#include <time.h>voidMain () {//dword T_start = GetTickCount (); Autot = Clock (); Cshudu instance; Instance. Createsolution ();//dword t_end = GetTickCount (); printf("program run time is%d ms\n", +*static_cast<float> (Clock ()-T)/clocks_per_sec);}
The implementation method of C + + for programming beauty Sudoku Solver