Ahoj ja sem se pokusil napsat kdo ktery vygeneruje celepole sudoku podle pravidel vim že ten kod za nic nestoji ale chtěl bych se zeptat na jednu věc, nejprve sem to udělal tak že se doplnuje jedno nahodne cislo a pak se zkontroluje zda se jž v to mčvterci řadku nebo sloupci neobjevil pokud jo tak se vrati zpět a zkouší znovu, jenže tak malokdy vygeneruje cele pole sudoku tak sem zkusil aby při několika pruchodech se vratil zpětna začatek a zkoušel pole naplnit znovu, jenže při vypise sem zjistil že se generuje pořad ty same čísla (asi) a nevim co stim...jinak vim že ten kod je uplně na nic ale díky za rady
#include <iostream>
#include <cstdlib>
#include <ctime>
const int size=3;
using namespace std;
int main() {
srand(time(0));
int pole[size*size][size*size];
int poc = 0;
int kop = 0;
int nah = 0;
int up = 0;
int up_2 = 0;
int cislo;
for(int vc=0;vc<size*size;vc=vc+size)
{
nah = 0;
for(int k=0;k<size*size;k=k+size)
{
for(int d = 0;d<size;d++)
{
for(int c = kop;c<size ;c++)
{
cislo = rand() % 9+1;
pole[d+vc][c+k]= cislo;
//radky
nah++;
for(int m = 0;m<size*size;m++)
{
if(pole[d+vc][m] == cislo)
poc++;
}
//cout<<d;
//sloupce
for(int m = 0;m<size*size;m++)
{
if(pole[m][c+k] == cislo)
poc++;
}
for(int a = 0;a<size;a++)
{
for(int i = 0;i<size;i++)
{
if(pole[a+vc][i+k] == cislo)
{
poc++;
}
}
}
if(poc>3)
{
c--;
if(nah==15)
{
c=size;
d=size;
k=size*size;
vc = 0;
}
}
if(poc<=3)
nah = 0;
poc=0;
}
//
//
}
}
for(int a = 0;a<size;a++)
{
for(int c = 0;c<size*size;c++)
{
cout<<pole[a][c]<<" ";
}cout<<"\n";
}
}
/*
for(int a = 0;a<size;a++)
{
for(int c = 0;c<size*size;c++)
{
cout<<pole[a][c]<<" ";
}cout<<"\n";
}
*/
for(int a = 0;a<size*size;a++)
{
for(int c = 0;c<size*size;c++)
{
cout<<pole[a][c]<<" ";
}cout<<"\n";
}
system("pause");
}
Fórum › C / C++
Generovani pole
Při generování čísel na intervalu 1 až 9 se nevyhneš shodám. To tak prostě může být a jde o náhodu (je to náhodné číslo :smile1: ).
Problém je ale jinde. Problém je v tom, jak ses rozhodnul řešit tuto úlohu. Sudoku je typický (a možná by se mohlo říct ukázkový) příklad na nalezení řešení pomocí backtrackingu. Náhodné zkoušení je v tomto případě spíše na škodu. Je potřeba použít systematického prohledávání stavového prostoru. A co nejvíce využít možností ořezání neperspektivních větví (tj. při první kolizi). Dají se tam najít ještě další optimalizace (do testovaného políčka už většinou lze zapsat pouze několik z 9 možných čísel apod.), ale stačí i ta skoro nejhloupější varianta.
Neříkám, že to nejde bez backtrackingu. Samozřejmě, že to jde, ale skoro bych řekl, že Sudoku je pro backtracking jako stvořené. Sám si psal, že ti to skoro nikdy nenašlo řešení a tak ses rozhodnul přidal tam vracení se zpět (v jakési podobě). Základní problém toho tvého řešení je v tom, že když nenajdeš řešení, tak nemáš nic. Nemáš řešení a nemáš ani informace o tom, jak k nějakému dojít. Návrat zpátky to třeba trochu vylepší, ale jenom supluješ něco, co je součástí backtrackingu - větev nevede k řešení, tak jí zahodíš. V tvém případě se třeba vrátíš, ale pořád budeš mít informace pouze o stávajícím řešení, takže se ti může stát, že i při vracení se, budeš neustále testovat již jednou odmítnutá řešení.
Kód louskat nebudu :smile14: , musel bych ho nejdřív celý upravit, aby byl čitelný, a to po mě nemůžeš chtít :smile1: .
Přidej příspěvek
Ano, opravdu chci reagovat → zobrazí formulář pro přidání příspěvku
×Vložení zdrojáku
×Vložení obrázku
×Vložení videa
Uživatelé prohlížející si toto vlákno
Podobná vlákna
Generování obrázků — založil Marek Štafl
Generováni frekvence — založil Tomáš
Python - generovaní — založil Jandak
Generování tahů — založil Kuba
Generování posloupnosti — založil Rail
Moderátoři diskuze