gpt4 book ai didi

c - 数独 9x9 C 盒

转载 作者:行者123 更新时间:2023-11-30 17:41:51 25 4
gpt4 key购买 nike

我有一个用 C 编写的用于 9x9 盒子的数独解算器的应用程序的问题,它使用递归来解决并找到所有组合,但是我添加了一行调试,我发现了问题,但我不知道为什么:

问题出在这一行:

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 等等。for 中的变量 i 不会变为 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 block 。

关于c - 数独 9x9 C 盒,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20978370/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com