首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >数独9x9盒(C)

数独9x9盒(C)
EN

Stack Overflow用户
提问于 2014-01-07 17:47:10
回答 1查看 531关注 0票数 0

我遇到了一个应用程序在C中为9x9框编写的应用程序的问题,它使用递归来解决和找到所有的组合,但是我添加了一行调试,我发现了这个问题,但我不知道为什么:

问题就在这条线上:

代码语言:javascript
复制
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();
}

所有代码都在这里:

代码语言:javascript
复制
#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调试声音如下所示:

代码语言:javascript
复制
Pozition 1 7 takes valor 8
Pozition 1 8 takes valor 7
pozition 1 9 ...

等等。我看到只有5,所以位置1,5/ 1,6/ 1,7等等。我的变量不会变成2.

忘记提及(功能"Afisare“意为”打印“解决方案)

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2014-01-07 17:56:02

问题可能在valid()中。

代码语言:javascript
复制
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,这根本没有意义。

你想要的应该是:

代码语言:javascript
复制
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块。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/20978370

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档