C编程-索多库解决方案(回溯)

C编程-索多库解决方案(回溯),c,recursion,backtracking,C,Recursion,Backtracking,问题是:从用户的sodoku板上获取,如果有打印它的解决方案,如果没有打印没有解决方案! soduko的解决方案:两个相同的数字mm不能出现在同一行上; 同一列中不得出现两个相同的数字。 当我放置soduko板和大小(代码中显示的全局参数)时,我编写了一个工作完美的程序,但当我试图从用户那里接收时,运行解决方案花费了太多时间,有时它什么都不运行。我想知道为什么 #include <stdio.h> #include <stdlib.h> #define SIZE 5

问题是:从用户的sodoku板上获取,如果有打印它的解决方案,如果没有打印没有解决方案! soduko的解决方案:两个相同的数字mm不能出现在同一行上; 同一列中不得出现两个相同的数字。 当我放置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;
}
#包括
#包括
#定义尺寸5
整数矩阵[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;

对于(i=0;i我怀疑您的问题与一件事有关:
#定义大小
,动态读取时可能忘记更新。由于您在循环中使用了
SIZE
,如果这不是矩阵的实际大小,则可能无法工作。我已更改了2行,并添加了3行其他内容(结尾有注释的行)。请立即尝试

#include <stdio.h>
#include <stdlib.h>

int SIZE; //changed here

int** matrix; //changed here

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** ReadSoduko(int n) {
    int** matrix = (int**)malloc((sizeof(int*)) * n);
    for (int i = 0; i < n; ++i) {
        matrix[i] = (int*) 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;
}

int main()
{
    printf("Size of matrix: "); //added this
    scanf("%d", &SIZE); //added this
    matrix = ReadSoduko(SIZE); //added this
    if (solve_sudoku())
        print_sudoku();
    else
        printf("No solution!\n");
    return 0;
}

#包括
#包括
int SIZE;//此处已更改
int**matrix;//此处已更改
void print_sudoku()
{
int i,j;
对于(i=0;i对于(i=1;i),电路板的数字范围为1到9,但解算器仅检查1到5之间的数字:
(i=1;isorry我更正了矩阵,在这个问题中,他们要求假设输入是正确的。代码对我来说是可行的。我的问题是,当我试图将用户插入其sodoku板的可能性放入时,我在运行它时遇到了问题。程序运行得非常好(执行时间0.047秒),正如我说的,我对程序本身没有问题,但是当我用函数ReadSodoku替换矩阵时,我在运行它时遇到了问题。好的,然后显示代码。谢谢,现在它工作了。但是现在执行时间很长,他们让我们想一个代码,它可以在几秒钟内完成。我需要想一个方法来改进它。它必须吗动态分配?你可能会因为缓存丢失而失去速度。也许你可以静态分配一个更大的矩阵,并使用你需要的数量。或者你可以分配一个大小为N*N的数组。代码对我提供的每一块sodoku板都有效,但对于没有解决方案的9*9 sodoku,它不起作用。你知道为什么吗?你是什么意思by不起作用?你希望它做什么?它在做什么?它的价值观是什么?
#include <stdio.h>
#include <stdlib.h>

int SIZE; //changed here

int** matrix; //changed here

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** ReadSoduko(int n) {
    int** matrix = (int**)malloc((sizeof(int*)) * n);
    for (int i = 0; i < n; ++i) {
        matrix[i] = (int*) 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;
}

int main()
{
    printf("Size of matrix: "); //added this
    scanf("%d", &SIZE); //added this
    matrix = ReadSoduko(SIZE); //added this
    if (solve_sudoku())
        print_sudoku();
    else
        printf("No solution!\n");
    return 0;
}