c 中的数独代码检查器

Sudoku code checker in c

我正在为 class 编写一个数独解决方案检查程序,但我碰壁了。

我正在检查是否可以查看各个列和行是否唯一。出于某种原因,代码在 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;
}

忘记我的网格 for 循环,一旦我弄清楚如何使列和行正常工作,我就会处理它。

感谢您的帮助!

这是一个会导致程序在应该成功时失败的输入

1 
1 2 3 4 5
2 3 4 5 1
3 4 5 1 2
4 5 1 2 3
5 1 2 3 4

输出将是

没有

编辑:它现在使用 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;
}

输入:

1 
1 2 3 4 5 6 7 8 9 
2 3 4 5 6 7 8 9 1
3 4 5 6 7 8 9 1 2
4 5 6 7 8 9 1 2 3
5 6 7 8 9 1 2 3 4
6 7 8 9 1 2 3 4 5
7 8 9 1 2 3 4 5 6
8 9 1 2 3 4 5 6 7
9 1 2 3 4 5 6 7 8
int array[5][5];

所以数组分配为5x5

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

你的索引从 0 到 5 ..

要使用更大的空间,请将所有“5”替换为预编译器定义。

#define SUDOKU_SIDE_LENGTH 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]));
        }
    }

等.. 这将确保您始终为数组分配足够的 space。

根据定义调整大小,而不是在代码中..

@ameyCU 帮助找到了我代码中的错误

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

问题是比较。

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;
     }
  }
}
 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;
      }
    }
 }

尽管已经指出数组被覆盖,但您的逻辑是有缺陷的。您根本不使用 j。您只是在比较相同的值五次。