[英]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.