sudoku_solve Sudoku algorithm

Sudoku rules

First look at Sudoku

Sudoku rule is simple:

  • Each row comprises a number from 1 to 9, and can not be repeated.
  • Each column includes a number from 1 to 9, and can not be repeated.
  • Each group includes a number from 1 to 9, and can not be repeated.

Sudoku title of the basic requirements:
Sudoku problem requires a unique solution to have a single number, in:

  • It has not filled the space with its row, column, group coincide.
  • Using traversal way to find Sudoku solution, and the solution is unique.

Generating a number of separate steps and a flowchart of title

step

  • A step of generating one unit are all empty space Sudoku
  • Step two, randomly selecting an empty cell, which find all possible solutions
  • Step three, empty cells each possible traversal solution. Each solution is filled, the number of filled only after the number of requirements Solutions.
  • Step Four unique solution if the number of possible solutions filled in after the number is one, then this number is filled only after this number of possible solutions is the generation of unique, otherwise, randomly selecting a possible solution, step two.
    Code
#include<iostream>
using namespace std;
///N=9;
int n = 9;
bool isPossible(int mat[][9], int i, int j, int no){
	///Row or col nahin hona chahiye
	for (int x = 0; x<n; x++){
		if (mat[x][j] == no || mat[i][x] == no){
			return false;
		}
	}
	/// Subgrid mein nahi hona chahiye
	int sx = (i / 3) * 3;
	int sy = (j / 3) * 3;

	for (int x = sx; x<sx + 3; x++){
		for (int y = sy; y<sy + 3; y++){
			if (mat[x][y] == no){
				return false;
			}
		}
	}
	return true;
}
void printMat(int mat[][9])
{
	for (int i = 0; i<n; i++){
		for (int j = 0; j<n; j++){
			cout << mat[i][j] << " ";
			if ((j + 1) % 3 == 0){
				cout << '\t';
			}
		}
		if ((i + 1) % 3 == 0){
			cout << endl;
		}
		cout << endl;
	}
}
bool solveSudoku(int mat[][9], int i, int j){
	///Base Case
	if (i == 9){
		///Solve kr chuke hain for 9 rows already
		printMat(mat);
		return true;
	}
	///Crossed the last  Cell in the row
	if (j == 9){
		return solveSudoku(mat, i + 1, 0);
	}
	///Blue Cell - Skip
	if (mat[i][j] != 0){
		return solveSudoku(mat, i, j + 1);
	}
	///White Cell
	///Try to place every possible no
	for (int no = 1; no <= 9; no++){
		if (isPossible(mat, i, j, no)){
			///Place the no - assuming solution aa jayega
			mat[i][j] = no;
			bool aageKiSolveHui = solveSudoku(mat, i, j + 1);
			if (aageKiSolveHui){
				return true;
			}
			///Nahin solve hui
			///loop will place the next no.
		}
	}
	///Sare no try kr liey, kisi se bhi solve nahi hui
	mat[i][j] = 0;
	return false;
}
int main(){
	int mat[9][9] =
	{ { 5, 3, 0, 0, 7, 0, 0, 0, 0 },
	{ 6, 0, 0, 1, 9, 5, 0, 0, 0 },
	{ 0, 9, 8, 0, 0, 0, 0, 6, 0 },
	{ 8, 0, 0, 0, 6, 0, 0, 0, 3 },
	{ 4, 0, 0, 8, 0, 3, 0, 0, 1 },
	{ 7, 0, 0, 0, 2, 0, 0, 0, 6 },
	{ 0, 6, 0, 0, 0, 0, 2, 8, 0 },
	{ 0, 0, 0, 4, 1, 9, 0, 0, 5 },
	{ 0, 0, 0, 0, 8, 0, 0, 7, 9 } };
	printMat(mat);
	cout << "Solution " << endl;
	solveSudoku(mat, 0, 0);
	system("pause");
	return 0;
}

 

 

 

 

Guess you like

Origin www.cnblogs.com/277223178dudu/p/11403791.html