当前位置:网站首页>Solve 9 with C language × 9 Sudoku (personal test available) (thinking analysis)

Solve 9 with C language × 9 Sudoku (personal test available) (thinking analysis)

2022-07-06 02:38:00 Fish ball

use C Linguistic solution 9×9 Sudoku ( Close test available )( Thought analysis )


Sudoku , I believe we are all familiar , Just like this. :


I have liked Sudoku since a few years ago , Now I'm in College , I want to return to childhood during this winter vacation —— Play Sudoku . Played for days , Suddenly wake yourself up ! Think of me as a programmer …… Why not do something that should be done ?


Solve Sudoku with code !!!


The method used is the basic idea of solving Sudoku , That is, according to each row, each column and the Jiugong grid , The number does not repeat the principle of sequential retrieval .
#include <stdio.h>
#include <stdbool.h>
#include <windows.h>
#pragma warning(disable:4996);

// Read the incomplete Sudoku matrix 
void readMatrix(int array[9][9])
{
    
	int row, // That's ok 
		col; // Column 
	for (row = 0; row < 9; row++)
	{
    
		for (col = 0; col < 9; col++)
			scanf(" %1d", &array[row][col]); /**** Be careful %1d And there are spaces in front of ****/
		getchar();
	}
}

// Determine whether there are duplicate numbers on rows and columns ( Return without repetition true, Repeat return false)
bool RowAndColRepeat(int array[9][9], int row, int col, int num)
{
    
	int i; // Count 
	// Determine whether there are duplicate numbers on the line 
	for (i = 0; i < 9; i++)
		if (array[row][i] == num)
			return false;
	// Determine whether there are duplicate numbers on the column 
	for (i = 0; i < 9; i++)
		if (array[i][col] == num)
			return false;
	return true;
}

// Determine the position   Which is it? 3x3 squared paper for practicing calligraphy  
int getRowOrCol(int num)
{
    
	if (num < 3)
		return 0;
	else if (num < 6)
		return 3;
	else
		return 6;
}

// Judge 3x3 Is there a duplicate number in the Jiugong grid ( Return without repetition true, Repeat return false) 
bool BlockRepeat(int array[9][9], int row, int col, int num)
{
    
	int getRowOrCol(int num); // obtain 3x3 The function prototype declaration of the starting position of the Jiugong lattice  
	int rowStart, // Line number 
		colStart, // Column number 
		i, j; // Count 
	rowStart = getRowOrCol(row);
	colStart = getRowOrCol(col);
	for (i = rowStart; i < rowStart + 3; i++)
		for (j = colStart; j < colStart + 3; j++)
			if (array[i][j] == num)
				return false;
	return true;
}

// Deep search of Sudoku 
void calculation(int array[9][9], int row, int col)
{
    
	int i, j; // Count  // recursive , Set up exits : If the line number row Beyond array row subscript , Exit recursive output answer 
	if (row > 8)
	{
    
		for (i = 0; i < 9; i++)
		{
    
			for (j = 0; j < 9; j++)
				printf("%d ", array[i][j]);
			printf("\n");
		}
		return;
	}
	// If array[row][col] == 0 That is, the number of this position is not determined 
	if (array[row][col] == 0)
	{
    
		for (i = 1; i < 10; i++)
			// from 1 to 9 Start counting  for(i = 1;i < 10;i++)
			// Trial method : Judge whether there are duplicate numbers on the row and column of this position , Then judge where you are 3x3 Is it repeated in the palace 
			// If 1 to 9 There is a suitable number in , Then the number of this position is this number , And start traversing the next location 
			if (RowAndColRepeat(array, row, col, i) && BlockRepeat(array, row, col, i))
			{
    
				array[row][col] = i;
				calculation(array, row + (col + 1) / 9, (col + 1) % 9); // When the cells of each row have been traversed , Go to the next line  
			}
		array[row][col] = 0; // If there is no or incorrect number , Is reset to 0
	}
	else
	{
    	//  If the number of this position is determined, skip this position , Traverse the next position 
		calculation(array, row + (col + 1) / 9, (col + 1) % 9); // When the cells of each row have been traversed , Go to the next line 
	}
}

int main()
{
    
	int array[9][9];// Make a statement 9x9 Sudoku matrix 
	printf(" Please enter the title :\n");
	readMatrix(array);// Read Sudoku topics 
	printf("\n The result of the calculation is :\n");
	calculation(array, 0, 0);// Start deep search from the first cell 
	system("pause");// Pause window , Show results 
	return 0;
}


The effect is as follows :


Then there is the action , Write the answer into the question !!

There are still better ways , Welcome to the comment area to discuss ~~

原网站

版权声明
本文为[Fish ball]所创,转载请带上原文链接,感谢
https://yzsam.com/2022/02/202202140009224743.html