当前位置: 首页 > 知识库问答 >
问题:

数独:检查3x3网格的重复值

洪楚
2023-03-14

我曾经用C语言编写过一个数独谜题,但我陷入了一个问题:检查每个3x3网格是否没有重复的值。这是我的代码

#include <iostream>
#include <stdio.h>
#include <stdlib.h>
using namespace std; 
int v[10][10];
//Matrix start from 1 and end with 9
//So everywhere it should be i=1;i<=9 not from 0 to i<9 !!!
//Display function ( Display the results when it have)
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");
}
//Function to check the valability of value
int valid(int k, int ii, int jj)
{
    int i;
    //Check for Row/Column duplicate
    for(i = 1; i <= 9; ++i) {
        if (i != ii && v[i][jj] == k)
            return 0;
        if (i != jj && v[ii][i] == k)
            return 0;
    }
    //Returns 0 if duplicate found return 1 if no duplicate found.
    return 1;
}

void bt()
{
    int i,j,k,ok=0;
    //Backtracking function recursive
    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))
    {
        v[i][j]=k;
        bt();
    }
    v[i][j]=0;
}
int main()
{
    //Reading from the file the Matrix blank boxes with 0
    int i,j;
    freopen("sudoku.in","r",stdin);
    for(i=1;i<=9;i++)
    for(j=1;j<=9;j++)
    scanf("%d",&v[i][j]);

    bt();
    system("pause");
    return 0;
}

我知道在function Valid中,我应该有条件检查每个3x3网格,但我没有弄明白:我找到了创建一些变量开始和结束的解决方案,每个变量得到如下结果:

start = i/3*3;
finnish = j/3*3;

在我的例子中,i和j是ii和jj。

例如,我们发现了这样的东西:

  for (int row = (i / 3) * 3; row < (i / 3) * 3 + 3; row++)
    for (int col = (j / 3) * 3; col < (j / 3) * 3 + 3; col++)
      if (row != i && col != j && grid[row][col] == grid[i][j])
        return false;

我试过这个密码,但没用。

我不明白这一点:我有下一个数独矩阵:

1-1 1-2 1-3 1-4 1-5 1-6
2-1 2-2 2-3 2-4 2-5 2-6
3-1 3-2 3-3 3-4 3-5 3-6

如果我的代码将值放在3-2上,他如何在他的网格中检查重复值,该公式可能适用于1-1或3-3,但对于中间值不起作用,明白吗?

如果我的程序得到2-5矩阵值它应该检查这个值是否与1-4 1-5 1-6 2-4 2-6重复...直到3-6。

共有1个答案

居焱
2023-03-14

由于使用的索引数组是从1开始的,而不是从零开始的,因此在计算子网格索引时必须对此进行更正。

start = (i - 1) / 3 * 3 + 1;
finish = (j - 1) / 3 * 3 + 1;
 类似资料:
  • 这个程序的作用: 这个程序从一个类中获取值,并使用这些值作为数独游戏的起始值。我们将在一个典型的数独9x9网格中打印这些内容。然后,程序会提示用户在网格上给出一个坐标点,并在其中输入一个值。目前我正在做的是确保用户输入的值对解决这个难题是有效的。填好拼图后,每列、每行和3x3方块中不再有任何重复值,游戏应结束,输出应为“拼图完成”。 到目前为止,我的程序成功地检查了列和行中的重复值,但我不知道从哪

  • 我已经创建了一个程序,允许用户输入一个数独拼图的所有值,即9x9,将这些值存储在一个数组中,并可以检查所有行和列中的值是否不同,但我很难理解如何实现代码来关注3x3的每个子网格。我想我必须有最后一个嵌套for循环,它可能被3除,但我完全被这部分卡住了。 }

  • 当我试图检查数独的行中是否有重复的元素时,结果什么也没有返回。不知道代码是否正确。如果在一行中找到重复的元素,则需要打印找到的重复项。使用方法帮助我找到解决方案。

  • 我试图创建一个函数,给定数独板、行、列和值,它会遍历行和列所属的子网格并检查值是否在该子网格中。我已经制作了识别行和列属于哪个子网格的函数。我坚持使用检查值是否在该子网格中的函数。例如: 这应该迭代到:(3,9,1)、(8,7,6)和(2,8,5)。输出应该返回True,因为子网格中有9,否则返回False。到目前为止,我掌握的代码如下: 我希望我能自我解释,如果你有任何疑问,请尽管问。

  • 当我试图运行我的代码(在底部)时,我得到了下面的错误。 soo是this. this方法适用于配置和win10toos 就我所知,它们是一样的,只是一个更小,在一条线上。 主代码

  • 以下是我的方法: 我做了一个9x9二维整数数组来拼图。0表示只有一个空格。该方法检查每个3x3的正方形,并说明是否在其中一个正方形中发现了重复。但有时它仍然会说,有比赛时没有比赛。有人能看出哪里出了问题吗?