Generovani pole – C / C++ – Fórum – Programujte.com
 x   TIP: Přetáhni ikonu na hlavní panel pro připnutí webu
Reklama
Reklama

Generovani pole – C / C++ – Fórum – Programujte.comGenerovani pole – C / C++ – Fórum – Programujte.com

 

Hledá se programátor! Plat 1 800 € + bonusy (firma Boxmol.com)
quardi
~ Anonymní uživatel
2 příspěvky
26. 1. 2010   #1
-
0
-

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");
}

Nahlásit jako SPAM
IP: 77.48.244.–
Reklama
Reklama
liborb
~ Redaktor
+18
Guru
26. 1. 2010   #2
-
0
-

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.

Nahlásit jako SPAM
IP: 85.207.166.–
dep
~ Anonymní uživatel
2 příspěvky
26. 1. 2010   #3
-
0
-

To liborb : no ja vim ja sem to chtel zkusit pravě bez backtrakingu řešit jenže když sem zkoušel ten vypis tak se mi zdalo že se pořad opakujou stejne radky a zadne cisla se nemění... když dorazi na nah==15

Nahlásit jako SPAM
IP: 77.48.244.–
liborb
~ Redaktor
+18
Guru
26. 1. 2010   #4
-
0
-

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: .

Nahlásit jako SPAM
IP: 85.207.166.–
Bald3rr0
Super člen
26. 1. 2010   #5
-
0
-

To quardi : Pár dní zpět jsem tu psal svoje řešení generování sudoku, můžeš najít inspiraci tam.

Nahlásit jako SPAM
IP: 82.100.0.–
Zjistit počet nových příspěvků

Přidej příspěvek

Toto téma je starší jak čtvrt roku – přidej svůj příspěvek jen tehdy, máš-li k tématu opravdu co říct!

Ano, opravdu chci reagovat → zobrazí formulář pro přidání příspěvku

×Vložení zdrojáku

×Vložení obrázku

Vložit URL obrázku Vybrat obrázek na disku
Vlož URL adresu obrázku:
Klikni a vyber obrázek z počítače:

×Vložení videa

Aktuálně jsou podporována videa ze serverů YouTube, Vimeo a Dailymotion.
×
 
Podporujeme Gravatara.
Zadej URL adresu Avatara (40 x 40 px) nebo emailovou adresu pro použití Gravatara.
Email nikam neukládáme, po získání Gravatara je zahozen.
-
Pravidla pro psaní příspěvků, používej diakritiku. ENTER pro nový odstavec, SHIFT + ENTER pro nový řádek.
Sledovat nové příspěvky (pouze pro přihlášené)
Sleduj vlákno a v případě přidání nového příspěvku o tom budeš vědět mezi prvními.
Reaguješ na příspěvek:

Uživatelé prohlížející si toto vlákno

Uživatelé on-line: 0 registrovaných, 71 hostů

Podobná vlákna

Generování tahů — založil Kuba

Generování posloupnosti — založil Rail

Náhodné generování — založil to_jsem_ja

Generování datumu — založil Figa

Generování QR kódů — založil Aleš Krátký

Moderátoři diskuze

 

Hostujeme u Českého hostingu       ISSN 1801-1586       ⇡ Nahoru Webtea.cz logo © 20032016 Programujte.com
Zasadilo a pěstuje Webtea.cz, šéfredaktor Lukáš Churý