Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/60.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 数独解题-在回溯中跳过舞台_C_Recursion_Backtracking - Fatal编程技术网

C 数独解题-在回溯中跳过舞台

C 数独解题-在回溯中跳过舞台,c,recursion,backtracking,C,Recursion,Backtracking,我已经在这里请求帮助了,但是没有人回答,这真的很令人沮丧, 我正试图写一个代码来解决递归函数中的数独问题(回溯), 代码如下: #include <stdio.h> #include <windows.h> #define SIZE 9 #define SQUARE_SIZE 3 void print(int arrBoard[SIZE][SIZE]) { system("cls"); int i, j; for (i =

我已经在这里请求帮助了,但是没有人回答,这真的很令人沮丧, 我正试图写一个代码来解决递归函数中的数独问题(回溯), 代码如下:

#include <stdio.h>
#include <windows.h>

#define SIZE        9
#define SQUARE_SIZE 3

void print(int arrBoard[SIZE][SIZE])
{
     system("cls");
     int i, j;
     for (i = 0; i < SIZE; i++)
     {
         if (i % 3 == 0) printf("_ _ _ _ _ _ _ _ _ _ _ _\n");
         for (j = 0; j < SIZE; j++)
         {
             if (j % 3 == 0) printf("| ");
             printf("%d ", arrBoard[i][j]);
         }
         printf("\n");
     }

     Sleep(100);
}

BOOL IsValidRow(int arrBoard[SIZE][SIZE], int iNum, int iRow)
{
    int iCol;

    for (iCol = 0; iCol < SIZE; iCol++)
        if (arrBoard[iRow][iCol] == iNum) return FALSE;

    return TRUE;
}

BOOL IsValidCol(int arrBoard[SIZE][SIZE], int iNum, int iCol)
{
    int iRow;

    for (iRow = 0; iRow < SIZE; iRow++)
        if (arrBoard[iRow][iCol] == iNum) return FALSE;

    return TRUE;
}

BOOL IsValidSquare(int arrBoard[SIZE][SIZE], int iNum, int iRow, int iCol)
{
    iRow-= (iRow % SQUARE_SIZE);
    iCol-= (iCol % SQUARE_SIZE);

    int i, j;
    for(i = 0; i < SQUARE_SIZE; i++)
        for (j = 0; j < SQUARE_SIZE; j++)
            if (arrBoard[iRow + i][iCol + j] == iNum) return FALSE;

    return TRUE;
}

BOOL IsValid(int arrBoard[SIZE][SIZE], int iNum, int iRow, int iCol)
{
    if (IsValidRow(arrBoard, iNum, iRow) == FALSE) return FALSE;
    if (IsValidCol(arrBoard, iNum, iCol) == FALSE) return FALSE;
    if (IsValidSquare(arrBoard, iNum, iCol, iRow) == FALSE) return FALSE;

    return TRUE;
}

BOOL _Solve(int arrBoard[SIZE][SIZE], int iRow, int iCol)
{
    if (iRow == 9) return TRUE;

    if (arrBoard[iRow][iCol])
    {
        iRow = (iCol == 8) ? iRow + 1 : iRow;
        iCol = (iCol == 8) ? 0 : iCol + 1;

        if(_Solve(arrBoard, iRow, iCol)) return TRUE;
        return FALSE;
    }

    int iNewNum, iOldRow, iOldCol;
    for (iNewNum = 1; iNewNum <= SIZE; iNewNum++)
    {
        if (IsValid(arrBoard, iNewNum, iRow, iCol))
        {
            arrBoard[iRow][iCol] = iNewNum;
            print(arrBoard);
            iOldRow = iRow; iOldCol = iCol;
            iRow = (iCol == 8) ? iRow + 1 : iRow;
            iCol = (iCol == 8) ? 0 : iCol + 1;

            if (_Solve(arrBoard, iRow, iCol)) return TRUE;

            iRow = iOldRow; iCol = iOldCol;
            arrBoard[iRow][iCol] = 0;
        }
    }
    return FALSE;
}

int main(void)
{
    int arrBoard[SIZE][SIZE] =
    {0, 1, 0, 3, 6, 4, 0, 2, 0,
     6, 0, 0, 0, 0, 0, 0, 9, 7,
     0, 0, 0, 9, 0, 7, 0, 0, 0,
     0, 0, 6, 1, 0, 2, 8, 0, 0,
     1, 9, 8, 0, 0, 0, 0, 3, 2,
     0, 0, 7, 8, 0, 3, 9, 0, 0,
     0, 0, 0, 7, 0, 8, 0, 0, 0,
     4, 0, 0, 0, 0, 0, 0, 0, 3,
     0, 2, 0, 4, 5, 6, 0, 1, 0};

     _Solve(arrBoard, 0, 0);

    fflush(stdin);
    getchar();
    return 0;
}
#包括
#包括
#定义尺寸9
#定义正方形大小3
无效打印(整版[尺寸][尺寸])
{
系统(“cls”);
int i,j;
对于(i=0;i对于(iNewNum=1;iNewNum您已经完成了第一步,确定了问题发生的位置和时间。在调试器的帮助下,当iRow
为1且
iCol
为5时,您可以单步执行
\u Solve
。以下是我看到的,只要看看问题发生时的第一点:

  • IsValid(arrBoard、iNewNum、iRow、iCol)
    返回
    FALSE

  • 进入该方法,
    IsValidSquare(arrBoard、iNum、iCol、iRow)
    返回
    FALSE

  • 再看看这一行,似乎有点奇怪,在
    iRow
    之前有
    iCol
    ,而其他地方的模式是行,然后是列。将调用与声明/定义进行比较,看起来您混淆了调用站点的参数


修复调用IsValidSquare的参数顺序并重新运行会产生一个解决方案。

您已经完成了第一步,确定了问题发生的位置和时间。在调试器的帮助下,当
iRow
为1且
iCol
为5时,您可以单步执行
\u Solve
我看到的是,当你的问题发生时,只看第一点:

  • IsValid(arrBoard、iNewNum、iRow、iCol)
    返回
    FALSE

  • 进入该方法,
    IsValidSquare(arrBoard、iNum、iCol、iRow)
    返回
    FALSE

  • 再看看这一行,似乎有点奇怪,在
    iRow
    之前有
    iCol
    ,而其他地方的模式是行,然后是列。将调用与声明/定义进行比较,看起来您混淆了调用站点的参数


修正调用
IsValidSquare
的参数顺序,然后重新运行,得到了一个解决方案。

这是昨天其他人提出的问题。还有一个字符串反转算法。是否所有学校的作业截止日期都在本周?OP说“我已经在这里寻求帮助,但没有人回答”.也许前一个问题也是他的?@user1895924,你试过使用调试器吗?你是被迫使用递归吗?这个问题有更简单的方法。我不是在学校学习编程,只是一个爱好。这是昨天其他人问的。还有一个字符串反转算法。所有学校都有本周eir的作业截止日期?OP说“我已经在这里寻求帮助,但没有人回答”。也许前面的问题也是他的?@user1895924,你是否尝试过使用调试器?你是否被迫使用递归?解决这个问题有更简单的方法。我不是在学校学习编程,只是一种爱好