3x3 (9 박스)에 스도쿠를 썼습니다. 재귀 적으로 만들고 모든 조합을 생성하고 싶지만 어디서 잘못되었는지 모르겠습니다 ... 여기에 내 코드 : 코드와 난, 난 단지 내가하지 유효을 역 추적 함수를 호출해야한다고 생각 모든 조합을 생성하는 방법을 모르는 말했듯이스도쿠 9 박스 (3x3) 재귀 C 모든 조합의 역 추적
#include <iostream>
#include <stdio.h>
#include <stdlib.h>
#define dbg 0
using namespace std;
int n,st[100][100];
void afisare()
{
for(int i=1;i<=3;i++) {
for(int j=1;j<=3;j++)
printf("%2d",st[i][j]);
printf("\n");
}
printf("\n");
}
int valid(int k,int ii,int jj)
{
int i,j;
// if(k==1){
// if(dbg)printf("\nReturnez 1 deoarece k-ul este egal cu 1");
// return 1;
// }
for(i=1;i<=3;i++)
for(j=1;j<=3;j++)
if((i==ii) && (j==jj))
{
if(dbg)
printf("\nValorile nu indeplinesc criteriul, se incrementeaza j.");
}
else
{
if(dbg)
printf("\n i= %d j= %d",i,j);
if(dbg)
printf("\nSe verifica daca %d este egal cu casuta %d %d",k,i,j);
if(k==st[i][j]) {
if(dbg)printf("\nValorile sunt egale, returnez 0");
return 0;
}
}
if(dbg)
printf("\nValorile nu sunt egale, deci returnez 1");
return 1;
}
void back(int k)
{
int i,j;
if(dbg) printf("\nk=",k);
for(i=1;i<=3;i++) {
for(j=1;j<=3;j++)
{
if(dbg)
printf("\nVerifica daca casuta %d %d este egal cu 0",i,j);
if(st[i][j]==0) {
if(dbg) printf("\n Este egal cu 0");
if(dbg) printf("\n%d ia valoarea %d.",st[i][j],k);
st[i][j]=k;
if(dbg)
printf("\nSe verifica valabilitatea numarului %d",st[i][j]);
// while(valid(k,i,j)!=0)
if(valid(k,i,j)!=0) {
valid(++k,i,j);
//back(k+1);
}
else
do {
st[i][j]=k+1;
if(dbg)
printf("\nCasuta %d %d are noua valoare %d, veche valoare fiind %d.",i,j,k+1,k);
if(dbg)
("\nValoarea returnata este 0, merg cu urmatoarea valoare %d si verific valabilitatea.",k+1);
//back(k+1);
}
while(valid(++k,i,j)==0);
}
else
if(dbg)
printf("\nNu este egala cu 0 ci are valoarea %d",st[i][j]);
}
}
if(k>9 || st[3][3]!=0)
afisare();
//afisare();
}
int main()
{
int i,j;
freopen("sudoku.in","r",stdin);
for(i=1;i<=3;i++)
for(j=1;j<=3;j++)
scanf("%d",&st[i][j]);
/* for(i=1;i<=3;i++){
for(j=1;j<=3;j++){
printf("%2d",st[i][j]);
}
printf("\n");
}*/
back(1);
system("pause");
return 0;
}
...
이것은 영어로 된 설명이없는 정말 읽을 수없는 코드입니다. "잘못된 것"에 대해 자세히 설명해 주시겠습니까? 컴파일 오류가 있습니까? 너는 무엇을 얻 느냐? – OopsUser
예 현재 채우기가 유효한지 확인하고 유효하면 다음 값을 확인하고 확인하지만 재귀를 사용하여 솔루션을 표시 한 후 계속하고 모든 조합을 수행하려고합니다. –
@AlexandruBarbarosie 9 * 9 * 9는 729 (~ 2^10)입니다 ... 이것은별로 도움이되지 않습니다. OP는 알고리즘의 효율성이 아니라 역 추적의 원리에 대해 물어 봅니다.실제로 실제로 솔루션을 구현하고 실행 한 경우 최악의 경우 (완전히 비어있는 그리드)가 초 단위로 완료되며 대부분의 시간은 IO에 집중됩니다. – amnn