数独的代码检查器

时间:2015-09-01 06:51:20

标签: c sudoku

我正在为一堂课写一个Sudoku解决方案检查器而且我已经撞墙了。

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

输出

NO

编辑:现在正在使用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

4 个答案:

答案 0 :(得分:1)

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

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

答案 1 :(得分: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。您只是将相同的值进行五次比较。

答案 2 :(得分:0)

int array[5][5];

所以数组被分配为5x5

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

你正在从0到5进行索引..

要使用更大的版本,请使用预编译器定义替换所有这些&#34; 5&#34 ;.

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

等..这将确保您始终为阵列分配足够的空间。

调整定义的大小,而不是代码..

答案 3 :(得分:0)

问题在于比较。

parfor

我认为您使用i作为行和列索引,然后使用j迭代重复项。 k将是你所比较的...

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 */

这样可以解决你的溢出(k + 1)错误,并让你前进。 方块可以用

固定
 /* 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 */