【发布时间】:2021-04-15 04:50:21
【问题描述】:
问题是:从用户的数独板中获取,如果有解决方案打印它,如果没有打印没有解决方案! soduko的解决方法:两个相同的数字不能出现在同一行; 两个相同的数字不能出现在同一列中。 我编写了一个程序,当我放置 soduko 板和大小(全局参数 - 如我的代码所示)时,我编写了一个完美运行的程序,但是当我尝试从用户那里接收时,运行解决方案花费了很多时间,有时它没有重新调整任何东西。我想知道为什么?!
#include <stdio.h>
#include <stdlib.h>
#define SIZE 5
int matrix[5][5] = {
{4,2,0,0,5},
{2,0,0,1,3},
{5,0,1,2,0},
{0,0,3,0,2},
{0,0,0,0,0},
};
void print_sudoku()
{
int i,j;
for(i=0;i<SIZE;i++)
{
for(j=0;j<SIZE;j++)
{
printf("%d ",matrix[i][j]);
}
printf("\n");
}
}
int number_unassigned(int *row, int *col)
{
int num_unassign = 0;
int i,j;
for(i=0;i<SIZE;i++)
{
for(j=0;j<SIZE;j++)
{
if(matrix[i][j] == 0)
{
*row = i;
*col = j;
num_unassign = 1;
return num_unassign;
}
}
}
return num_unassign;
}
int is_safe(int n, int r, int c)
{
int i;
for(i=0;i<SIZE;i++)
{
if(matrix[r][i] == n)
return 0;
}
for(i=0;i<SIZE;i++)
{
if(matrix[i][c] == n)
return 0;
}
return 1;
}
int solve_sudoku()
{
int row;
int col;
if(number_unassigned(&row, &col) == 0)
return 1;
int i;
for(i=1;i<=SIZE;i++)
{
if(is_safe(i, row, col))
{
matrix[row][col] = i;
if(solve_sudoku())
return 1;
matrix[row][col]=0;
}
}
return 0;
}
int main()
{
if (solve_sudoku())
print_sudoku();
else
printf("No solution!\n");
return 0;
}
这是我用来要求用户进入数独板的代码:
int** ReadSoduko(int n) {
int** matrix = (int**) malloc((sizeof(int*)) * n);
for(int i = 0; i < n; ++i) {
matrix[i] = malloc(sizeof(int) * n);
}
printf("\nEnter your soduko board:\n");
for(int i = 0; i < n; ++i) {
printf("Enter row [%d]: ", i);
for(int j = 0; j < n; ++j) {
scanf("%d", &matrix[i][j]);
}
}
return matrix;
}
【问题讨论】:
-
棋盘有 1 到 9 的数字,但求解器只检查 1 到 5 的数字:
for(i=1;i<=SIZE;i++)。使用 1 到 5 可能没有解决方案,因此求解器需要检查所有可能性。如果有 12 个空格,则需要 5^12 = 244e6 次尝试才能确定没有解决方案。如果用户用更多空白空间制作更大的板,则可能需要更长的时间。 -
对不起,我更正了矩阵,在这个问题中,他们要求假设输入是正确的。该代码对我有用。我的问题是,当我试图让用户插入他的数独板时,我在运行它时遇到了问题。
-
该程序运行得非常好(执行时间 0.047 秒),正如我所说的,程序本身没有问题,但是当我用函数 ReadSodoku 替换矩阵时,运行它时遇到问题。
-
好的,然后显示该代码。
标签: c recursion backtracking