谁知道这个数独代码的思路和里面各个函数的作用啊
#include<stdio.h>
#include<stdlib.h>
#include<time.h>
#define ROW 9
#define COL 9
#define SIZE 9
#define CORRECT 0
#define WRONG -1
#define MAXNUM 1000
int checkSudoku(const char a[][COL]){
int i,j,x,y;
for( i = 0; i < ROW ; i++){
for(j = 0 ; j < COL ; j++){
for(x = 0 ; x < COL ; x++)
if(a[i][x] == a[i][j] && x != j )
return WRONG;
for(x = 0 ; x < ROW ; x++)
if(a[x][j] == a[i][j] && x != i )
return WRONG;
for(x = i/3*3 ; x < i/3*3+3 ; x ++)
for(y = j/3*3 ; y < j/3*3+3 ; y++)
if(a[x][y] == a[i][j] && (x != i && y != j))
return WRONG;
}
}
return CORRECT;
}
void printSudoku(const char a[][COL]){
int i,j;
printf("\n ┌────┬────┬────┐\n");
for( i = 0 ; i < ROW ; i++){
if(i != 0 && i%3 == 0) printf(" ├────┼────┼────┤\n");
printf(" │");
for( j = 0 ; j < COL ; j++){
if(j != 0 && j%3 == 0) printf(" │");
if(a[i][j])
printf(" %d",a[i][j]);
else printf(" ");
}
printf(" │\n");
}
printf(" └────┴────┴────┘\n");
}
void readFromFile(char a[][COL], const char filename[]){
// To Be Solved
// 从文件filename中读取到的数独初盘存储到数组a[][COL]中
FILE *file=fopen(filename,"r+");
int i, j;
for (i=0;i<ROW;i++)
{
for (j=0;j<COL;j++)
{
fscanf(file,"%d ",&a[i][j]);
}
}
fclose(file);
}
int isValid(char b[][COL], int x, int y, int num)
{
for (int i = 0; i < 9; i++)
{
if (b[x][i] == num || b[i][y] == num)
{
return 0;
}
}
int startRow = (x / 3) * 3;
int startCol = (y / 3) * 3;
for (int i = startRow; i < startRow + 3; i++)
{
for (int j = startCol; j < startCol + 3; j++)
{
if (b[i][j] == num)
{
return 0;
}
}
}
return 1;
}
int solve(char b[][COL])
{
for (int i=0;i<SIZE;i++)
{
for (int j=0;j<SIZE;j++)
{
if (b[i][j]==0)
{
for (int num=1;num<=SIZE;num++)
{
if (isValid(b,i,j,num))
{
b[i][j]=num;
if (solve(b))
{
return 1;
}
b[i][j]=0;
}
}
return 0;
}
}
}
return 1;
}
int solveSudoku(const char a[][COL], char b[][COL]){
// To Be Solved
// 参数const char a[][COL]表示初盘二维数组;
// 参数char b[][COL]表示解的二维数组。
for (int i = 0;i<ROW;i++)
{
for (int j=0;j<COL;j++)
{
b[i][j]=a[i][j];
}
}
solve(b);
}
int main(){
char starting_grid[ROW][COL]={0};
char result[ROW][COL]={0};
char filename[50];
int rr;
double time_from, time_to, time_sum = 0;
int i;
for(i=0;i<MAXNUM;i++){
sprintf(filename,"D:\\二级项目\\数独\\sudoku\\%04d.txt",i);
readFromFile(starting_grid,filename);
printf("\n\n *%4d *",i);
printSudoku(starting_grid);
time_from = clock();
solveSudoku(starting_grid,result);
time_to = clock();
time_sum += time_to - time_from;
printSudoku(result);
rr = checkSudoku(result);
if( rr == WRONG){
printf("Something goes wrong...\n");
return WRONG;
}
else printf(" Correct!!!\n");
printf(" ==============================");
}
printf("\n Congretulations! ToTal Time:%fs\n",time_sum / CLOCKS_PER_SEC);
return 0;
}
int main(void)
{
struct STUDENT student1; /*用struct STUDENT结构体类型定义结构体变量student1*/
student1.birthday.year = 1989;
student1.birthday.month = 3;
student1.birthday.day = 29;
student1.num = 1207041;
student1.score = 100;
return 0;
}
访问方式:
结构体变量.成员名
有用望采纳:
这段代码是一个解数独的程序,下面是代码中各个函数的作用和整体思路:
checkSudoku()
函数:
printSudoku()
函数:
readFromFile()
函数:
isValid()
函数:
solve()
函数:
solveSudoku()
函数:
solve()
函数解决数独。solve()
函数解决数独。主函数 main()
的执行流程如下:
starting_grid
和 result
。readFromFile()
从文件中读取数独的初始状态到 starting_grid
中。solveSudoku()
解决数独,并记录解决数独的时间。综上所述,该代码实现了解决数独的功能,其中 solve()
函数使用了递归回溯算法来搜索数独的解,通过不断尝试填入数字并判断是否满足数独规则来逐步解决数独。