簡體   English   中英

在 C 上制作一個 empy 數獨求解器

[英]Making an empy Sudoku solver on C

所以我在 class 中得到了一個任務來制作一個空數獨,每次都會創建一個 9x9 的隨機解。 我到了每行和每列得到不同數字但不是在每個 3x3 矩陣上得到不同數字的地步,我無法弄清楚如何從這里開始 go。 我們還沒有學習遞歸,只能使用代碼中列出的庫。

  #include <stdio.h>
#include <stdlib.h>
#include <time.h>
#define NINE 9
#define ONE 1

void solve_sudoku(int board[9][9])
{
    srand(time(0));
    int count = 0;
    for (int i = 0;i <= NINE;i++)
    {
        for (int j = 0;j < NINE;j++)
        {
            board[i][j] =(rand() % NINE)+ONE;
            for (int k = 0;k < 9;k++)
            {
                int clone_i = i;
                int clone_j = j;
                while (board[i][k] == board[i][j])
                {
                    if (j == k)
                    {
                        break;
                    }
                    count++;
                    board[i][j] = (rand() % NINE) + ONE;
                    k = 0;
                }
                while(board[k][j]==board[i][j])
                    {
                    if (i == k)
                    {
                        break;
                    }
                    count++;
                        board[i][j] = (rand() % NINE) + ONE;
                        k = 0;
                    }
                if (count > 300 || (board[i][j] == board[i][k] && j != k))
                {
                    for (int i = clone_i;i < clone_i + 1;i++)
                        for (int l = 0;l < 9;l++)
                        {
                            board[i][l] = 0;
                        }
                    count = 0;
                    k = 0;
                    j = 0;
                }
                
                }
            }
        }
    }



void print_sudoku(int board[][9])
{
    printf("The soduko solution is: \n");
    for (int i = 0;i < NINE;i++)
    {
        for (int k = 0;k < NINE;k++)
        {
            printf("%d ", board[i][k]);
        }
        printf("\n");
    }
}

int main()
{
    int sud[9][9] = { 0 };
    int matrix_size = 9;
    solve_sudoku(sud);
    print_sudoku(sud);
    return 0;
}

我認為您的意思是您需要生成符合數獨標准的隨機 9 x 9 數字網格,即每行、列和塊都包含所有九位數字。 在這種情況下,您將采取非常困難的方式。 也許這受到了將程序視為求解器的啟發,而不是它真正需要的東西:生成器。

考慮到用算法寫下至少一個有效的數獨是很容易的:

 1 2 3 | 4 5 6 | 7 8 9
 4 5 6 | 7 8 9 | 1 2 3
 7 8 9 | 1 2 3 | 4 5 6
 ------+-------+------
 2 3 4 | 5 6 7 | 8 9 1
 5 6 7 | 8 9 1 | 2 3 4
 8 9 1 | 2 3 4 | 5 6 7
 ------+-------+------
 3 4 5 | 6 7 8 | 9 1 2
 6 7 8 | 9 1 2 | 3 4 5
 9 1 2 | 3 4 5 | 6 7 8

現在考慮您總是可以通過交換兩行或兩列將一個有效的數獨轉換為不同的數獨,這樣沒有條目從一個塊移動到另一個塊。 例如,您可以將第一行與第三行交換,或將第五列與第六列交換。 如果你在一個有效的起始數獨上執行一堆這種隨機交換,那么你最終會得到一個滿足數獨標准的隨機網格。

請注意,如果您只需要制作可以僅通過推理解決的數獨,而無需反復試驗,那就是另一回事了。 為此,您可能確實需要一種基於求解器的方法,但從真正的求解器開始,您的代碼中沒有任何類似的東西。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM