[英]Sudoku 9x9 Boxes in C
我有一个用C编写的用于9x9盒子的Sudoku求解器的应用程序的问题,它使用递归来求解和查找所有组合,但是我添加了一行调试,但发现了问题,但不知道为什么:
问题在这条线上:
for(k=1;k<=9;k++)
if(valid(k,i,j))
{
printf("\nPozition %d %d takes valor %d.",i,j,k);
v[i][j]=k;
bt();
}
所有代码在这里:
#include <iostream>
#include <stdio.h>
#include <stdlib.h>
using namespace std;
int v[200][200];
void afisare()
{
for(int i=1;i<=9;i++){
for(int j=1;j<=9;j++)
printf("%2d",v[i][j]);
printf("\n");
}
printf("\n");
}
int valid(int k,int ii,int jj)
{
int i,j;
for(i=1;i<=9;i++)
for(j=1;j<=9;j++)
{
if((i!=ii || j!=jj) && v[i][j]==k)
return 0;
}
return 1;
}
void bt()
{
int i,j,k,ok=0;
for(i=1;i<=9;i++){
for(j=1;j<=9;j++)
if(v[i][j]==0)
{
ok=1;
break;
}
if(ok)
break;
}
if(!ok)
{
afisare();
return;
}
for(k=1;k<=9;k++)
if(valid(k,i,j))
{
printf("\nPozition %d %d takes valor %d.",i,j,k);
v[i][j]=k;
bt();
}
v[i][j]=0;
}
int main()
{
int i,j;
freopen("sudoku.in","r",stdin);
// freopen("rezultat.out","w",stdout);
for(i=1;i<=9;i++)
for(j=1;j<=9;j++)
scanf("%d",&v[i][j]);
for(i=1;i<=9;i++){
for(j=1;j<=9;j++)
printf("%2d",v[i][j]);
printf("\n");
}
bt();
system("pause");
return 0;
}
我从sudoku.in阅读信息; 我将0放在空盒子里。
printf调试声音如下:
Pozition 1 7 takes valor 8
Pozition 1 8 takes valor 7
pozition 1 9 ...
等等...我看到只有5个位置,所以位置1 5/1 6/1 7等等。而变量i in for不会变成2 ...
忘了提及(功能“ Afisare”表示“打印”解决方案)
问题可能出在valid()
。
int valid(int k,int ii,int jj)
{
int i,j;
for(i=1;i<=9;i++)
for(j=1;j<=9;j++)
{
if((i!=ii || j!=jj) && v[i][j]==k)
return 0;
}
return 1;
}
根据您的实现,如果v[1][1] == 1
,则v[9][9]
不能为1。这根本没有意义。
您想要的应该是:
int valid(int k, int ii, int jj)
{
int i;
for(i = 1; i <= 9; ++i) {
if (i != ii && v[i][jj] == k)
return 0;
if (i != jj && v[ii][i] == k)
return 0;
}
return 1;
}
另请注意,您仍然需要注意3x3块。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.