c语言中的数独代码检查器

c语言中的数独代码检查器,c,sudoku,C,Sudoku,我正在为一门课写一个数独解决方案检查器,我遇到了麻烦 我正在检查是否可以查看单个列和行是否唯一。出于某种原因,代码可以在4x4网格上运行,但一旦我达到5x5网格或更高的网格(目标是达到9x9网格),程序就会开始打印出它失败了,即使它应该成功 任何帮助都是非常需要的,我需要一个指向正确方向的点或我应该研究的点 代码如下: #include <stdio.h> #include <stdlib.h> int main () { int i, j, n, k, p,

我正在为一门课写一个数独解决方案检查器,我遇到了麻烦

我正在检查是否可以查看单个列和行是否唯一。出于某种原因,代码可以在4x4网格上运行,但一旦我达到5x5网格或更高的网格(目标是达到9x9网格),程序就会开始打印出它失败了,即使它应该成功

任何帮助都是非常需要的,我需要一个指向正确方向的点或我应该研究的点

代码如下:

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

int main ()
{
    int i, j, n, k, p, q;
    int fail;
    int array[5][5];
    int check[] = {1, 2, 3, 4, 5, 6, 7, 8, 9};
    int a = 0;
    char *output = NULL;

    scanf("%d", &n);

    // memory allocated for yes or no at end
    output = malloc(sizeof(int) * (n));

    while (a < n)
    {
        fail = 0;
        //  create this 2D array
        for (i = 0; i < 5; i++)
        {
            for (j = 0; j < 5; j++)
            {
                scanf("%d", &(array[i][j]));
            }
        }

        // seeing if row is unique
        for (i = 0; i < 5; i++)
        {
            for (j = 0; j < 5; j++)
            {
                for (k = 0; k < 5; k++)
                {
                if (array[i][k] == array[i][k+1])
                    fail += 1;
                }
            }
        }
        // seeing if column is unique
        for (i = 0; i < 5; i++)
        {
            for (j = 0; j < 5; j++)
            {
                for (k = 0; k < 5; k++)
                {
                if (array[k][j] == array[k+1][j])
                    fail += 1;
                }
            }
        }

       /* for (WHAT DO I DO FOR ROWS)
        {
            for (WHAT DO I DO FOR ROWS AGAIN BUT REPLACE ROWS WITH COLUMNS)
            {
                for (NOW IM LOST)
            }
        }

        */
        //  success or failure? 0 success, 1 failure
        if (fail >= 1)
            output[a] = 1;
        else
            output[a] = 0;

        a++;

        }

    // print out yah or nah

    for (i = 0; i < n; i++)
        {
            if (output[i] == 0)
                printf("YES\n");
            else
                printf("NO\n");
        }

  return 0;
}
产出将是

没有

编辑:它现在正在使用9x9网格!谢谢你的帮助

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

#define SIDE_LENGTH 9

int main ()
{
    int i, j, n, k, p, q;
    int fail;
    int array[SIDE_LENGTH][SIDE_LENGTH];
    int check[] = {1, 2, 3, 4, 5, 6, 7, 8, 9};
    int a = 0;
    char *output = NULL;

    scanf("%d", &n);

    // memory allocated for yes or no at end
    output = malloc(sizeof(int) * (n));

    while (a < n)
    {
        fail = 0;
        //  create this 2D array
        for (i = 0; i < SIDE_LENGTH; i++)
        {
            for (j = 0; j < SIDE_LENGTH; j++)
            {
                scanf("%d", &(array[i][j]));
            }
        }

        // seeing if row is unique
        for (i = 0; i < SIDE_LENGTH; i++)
        {
            for (j = 0; j < SIDE_LENGTH; j++)
            {
                for (k = 0; k < SIDE_LENGTH - 1; k++)
                {
                if (array[i][k] == array[i][k+1])
                    fail += 1;
                }
            }
        }
        // seeing if column is unique
        for (i = 0; i < SIDE_LENGTH; i++)
        {
            for (j = 0; j < SIDE_LENGTH; j++)
            {
                for (k = 0; k < SIDE_LENGTH - 1; k++)
                {
                if (array[k][j] == array[k+1][j])
                    fail += 1;
                }
            }
        }

       /* for (WHAT DO I DO FOR ROWS)
        {
            for (WHAT DO I DO FOR ROWS AGAIN BUT REPLACE ROWS WITH COLUMNS)
            {
                for (NOW IM LOST)
            }
        }

        */
        //  success or failure? 0 success, 1 failure
        if (fail >= 1)
            output[a] = 1;
        else
            output[a] = 0;

        a++;

        }

    // print out yah or nah

    for (i = 0; i < n; i++)
        {
            if (output[i] == 0)
                printf("YES\n");
            else
                printf("NO\n");
        }

  return 0;
}
因此,数组被分配为5x5

    for (i = 0; i < 5; i++)
    {
        for (j = 0; j < 5; j++)
        {
            scanf("%d", &(array[i][j]));
        }
    }

for(i=0;i
等等。。这将确保始终为阵列分配足够的空间


调整定义上的大小,而不是代码中的大小。

@ameyCU帮助查找代码中的错误


将k设置为比i和j设置的值小一,允许代码在任何X*X大小的网格上成功运行。因为k比i和j小1,所以它不会尝试访问阵列中尚未分配的部分,这就是我的问题所在。

问题在于比较

if (array[i][k] == array[i][k+1])
我认为您使用I作为行和列索引,然后使用j来迭代重复项。k将是你所比较的,所以

/* compare if j'th value is same as k'th value */ 
if (j != k && array[i][j] == array[i][k]) /* Don't check same against same */
第二个比较应该是

 /* compare if j'th value is same as k'th value */ 
if (j != k && array[j][i] == array[k][i]) /* Don't check same against same */
这将修复您的溢出(k+1)错误,并让您继续。 这些方块可以用金属来固定

struct co_ords {
    int x;
    int y;
};
struct co_ords boxes[][9] = {{ {0,0}, {0,1}, {0,2},
                               {1,0}, {1,1}, {1,2},
                               {2,0}, {2,1}, {2,2} 
                             },
                             { {3,0}, {3,1}, {3,2},
                               {4,0}, {4,1}, {4,2},
                               {5,0}, {5,1}, {5,2} },
... /* more boxes go here */
                             { {6,6}, {6,7}, {6,8},
                               {7,6}, {7,7}, {7,8},
                               {8,6}, {8,7}, {8,8} }};


for( i = 0; i < 9; i++ ){
  struct co_ords current_box * = boxes[i];
  for( j = 0; j < 9; j++ ) {
     for( k = 0; k < 9; k++ ){
        if( j != k && array[ current_box[j].x ][ current_box[j].y] == array[ current_box[k].x ][ current_box[k].y] )
           fail += 1;
     }
  }
}
结构公司{ int x; int-y; }; 结构合作词框[][9]={{{0,0},{0,1},{0,2}, {1,0}, {1,1}, {1,2}, {2,0}, {2,1}, {2,2} }, { {3,0}, {3,1}, {3,2}, {4,0}, {4,1}, {4,2}, {5,0}, {5,1}, {5,2} }, …/*更多的盒子放在这里*/ { {6,6}, {6,7}, {6,8}, {7,6}, {7,7}, {7,8}, {8,6}, {8,7}, {8,8} }}; 对于(i=0;i<9;i++){ 结构坐标当前坐标框*=坐标框[i]; 对于(j=0;j<9;j++){ 对于(k=0;k<9;k++){ 如果(j!=k&&array[current\u-box[j].x][current\u-box[j].y]==array[current\u-box[k].x][current\u-box[k].y]) 失败+=1; } } }
用于(i=0;i<5;i++)
{
对于(j=0;j<5;j++)
{
对于(k=0;k<5;k++)
{
if(数组[i][k]==数组[i][k+1])
失败+=1;
}
}
}

尽管如前所述覆盖了数组,但您的逻辑是有缺陷的。你根本不用
j
。您只需对相同的值进行五次比较。

array[i][k]==array[i][k+1]
um<代码>k+1?这超出了上次迭代的范围。我有一种强烈的感觉,这是我的逻辑的一个问题,我可以试着用(k=5;k>0;k--)做一个for循环,然后数组是array[I][k]==array[I][k-1]。显示一个失败的输入。@JoeyOhannesian让循环继续,直到
k更改我的逻辑使5x5数组工作!但6x6数组无法正常工作。预编译器会用一个值替换已定义的宏:
https://msdn.microsoft.com/en-us/library/teas0593.aspx
在编译(到但不包括)之前,这应该没问题。我完全忘了我能做到这一点,我将把它合并到中!不,他在那些循环中索引0到4,无法访问索引5。。。
int array[SUDOKU_SIDE_LENGTH ][SUDOKU_SIDE_LENGTH ];
    for (i = 0; i < SUDOKU_SIDE_LENGTH ; i++)
    {
        for (j = 0; j < SUDOKU_SIDE_LENGTH ; j++)
        {
            scanf("%d", &(array[i][j]));
        }
    }
if (array[i][k] == array[i][k+1])
/* compare if j'th value is same as k'th value */ 
if (j != k && array[i][j] == array[i][k]) /* Don't check same against same */
 /* compare if j'th value is same as k'th value */ 
if (j != k && array[j][i] == array[k][i]) /* Don't check same against same */
struct co_ords {
    int x;
    int y;
};
struct co_ords boxes[][9] = {{ {0,0}, {0,1}, {0,2},
                               {1,0}, {1,1}, {1,2},
                               {2,0}, {2,1}, {2,2} 
                             },
                             { {3,0}, {3,1}, {3,2},
                               {4,0}, {4,1}, {4,2},
                               {5,0}, {5,1}, {5,2} },
... /* more boxes go here */
                             { {6,6}, {6,7}, {6,8},
                               {7,6}, {7,7}, {7,8},
                               {8,6}, {8,7}, {8,8} }};


for( i = 0; i < 9; i++ ){
  struct co_ords current_box * = boxes[i];
  for( j = 0; j < 9; j++ ) {
     for( k = 0; k < 9; k++ ){
        if( j != k && array[ current_box[j].x ][ current_box[j].y] == array[ current_box[k].x ][ current_box[k].y] )
           fail += 1;
     }
  }
}
 for (i = 0; i < 5; i++)
 {
    for (j = 0; j < 5; j++)
    {
      for (k = 0; k < 5; k++)
      {
        if (array[i][k] == array[i][k+1])
        fail += 1;
      }
    }
 }