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