繁体   English   中英

数独:检查3x3网格中是否有重复值

[英]Sudoku: checking 3x3 grids for repeating values

我曾为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;
}

我知道在函数Valid中,我应该有条件检查每个3x3网格,但我不知道:我找到了创建一些变量start和end的解决方案,每个变量都得到这样的结果:

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而不是零开头,因此在计算子网格索引时必须对其进行更正。

start = (i - 1) / 3 * 3 + 1;
finish = (j - 1) / 3 * 3 + 1;

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM