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

Vylepseni podminky – C / C++ – Fórum – Programujte.comVylepseni podminky – C / C++ – Fórum – Programujte.com

 

Figa0
Super člen
15. 1. 2010   #1
-
0
-

Ahoj mam tento kod



for (int a=0; a<8; a++) {
for (int b=0; b<8; b++) {
array[a][ b ]=0;
}
}
bool xvalid = false;
for (int x=0; x<8; x++) {
for (int y=0; y<8; y++) {
while(xvalid == false) {
array[x][y]++;
if(array[x][y]!=array[x][0] && array[x][y]!=array[x][1] && array[x][y]!=array[x][2] && array[x][y]!=array[x][3] && array[x][y]!=array[x][4] && array[x][y]!=array[x][5] && array[x][y]!=array[x][6] && array[x][y]!=array[x][7] && array[x][y]!=array[x][8]) {
xvalid=true;
}
}
}
}

Kod se samozrejme zacykli protoze podminka s if se nikdy nesplni protoze se porovnava i index samotny napr. x=4 a y=5 takze v podmince dostanu array[4][5] != array[4][5] coz samozrejme nikdy nastat nemuze. Jak tedy vylepsit tuto podminku? Predem dekuji za odpovedi.

Nahlásit jako SPAM
IP: 87.249.133.–
m->29+6
Super člen
15. 1. 2010   #2
-
0
-

Čo to má preboha robiť? :-o Hlavne toto:

for (int a=0; a<8; a++) { 

for (int b=0; b<8; b++) {
array[a]=0;
}
}

Nahlásit jako SPAM
IP: 147.229.208.–
KIIV
~ Moderátor
+43
God of flame
15. 1. 2010   #3
-
0
-

To m->29 : obavam se ze toto forum jaksi nahrazuje [ ] a uvnitr i/b/u a podobne... proto je zbytek tucne

Nahlásit jako SPAM
IP: 80.250.1.–
Program vždy dělá to co naprogramujete, ne to co chcete...
Figa0
Super člen
16. 1. 2010   #4
-
0
-

Dekuji. Editovano. Prosim tedy o pomoc.

Nahlásit jako SPAM
IP: 87.249.133.–
KIIV
~ Moderátor
+43
God of flame
16. 1. 2010   #5
-
0
-

To Figa : ale k otazce.. co dalsi cyklus? jedes tak jak tak 0..8 .. a v pripade ze bude y == index tak hodis akorat continue;

otazkou je, o co se presne snazis.. nejaky sudoku nebo co?

Nahlásit jako SPAM
IP: 80.250.1.–
Program vždy dělá to co naprogramujete, ne to co chcete...
Figa0
Super člen
16. 1. 2010   #6
-
0
-

jjj sudoku. Diky sle nejak jsem to nepohopil tim si preci nepomuzu...

Nahlásit jako SPAM
IP: 87.249.133.–
KIIV
~ Moderátor
+43
God of flame
16. 1. 2010   #7
-
0
-

array[x][y]!=array[x][0] &&
array[x][y]!=array[x][1] &&
array[x][y]!=array[x][2] &&
array[x][y]!=array[x][3] &&
array[x][y]!=array[x][4] &&
array[x][y]!=array[x][5] &&
array[x][y]!=array[x][6] &&
array[x][y]!=array[x][7] &&
array[x][y]!=array[x][8]

nevim jak ty ale ja tam vidim proste sekvenci
xvalid = 1;
for ( z = 0 ; xvalid && z<9 ; z++ ) {
if ( array[x][y] == array[x][z] && y != z ) {
xvalid = 0;
}
}

teda pokud sem tam neudelal nejakou botu ale snad ne

akorat stejne presne nechapu o co se tam snazis... tak jak tak by toto bylo jen na radky a ty musis kontrolovat jeste sloupce a skupiny

Nahlásit jako SPAM
IP: 80.250.1.–
Program vždy dělá to co naprogramujete, ne to co chcete...
Figa0
Super člen
16. 1. 2010   #8
-
0
-

To vyresi ostatni cykli ted resim jen ten radek. Bohuzel ten tvuj kod take zustane v cyklu while.

Nahlásit jako SPAM
IP: 87.249.133.–
KIIV
~ Moderátor
+43
God of flame
16. 1. 2010   #9
-
0
-

protoze muj kod pouziva presne opacne xvalid ...
chce to cist kod, ktery pastujes...

pokud generujes sudoku tak timdle zpusobem to tak jak tak nikdy v zivote nemuzes zvladnout...
pokud resis, tak taky ne :D

Nahlásit jako SPAM
IP: 80.250.1.–
Program vždy dělá to co naprogramujete, ne to co chcete...
Figa0
Super člen
16. 1. 2010   #10
-
0
-

To KIIV : Jenze ten cyklus to neoveri pro vsechny. jakmile jednou dostane true tak skonci. Takhle to nepujde. Muzes me prosim trochu postouchnout spravnym smerem? Uz jsem toho vyzkousel opravdu spoustu.

Nahlásit jako SPAM
IP: 87.249.133.–
KIIV
~ Moderátor
+43
God of flame
16. 1. 2010   #11
-
0
-

tak se zbav xvalid && z podminky foru

Nahlásit jako SPAM
IP: 77.237.136.–
Program vždy dělá to co naprogramujete, ne to co chcete...
Figa0
Super člen
16. 1. 2010   #12
-
0
-

To preci taky nepomuze. Protoze to for ma urcene kolikrat probehne.

Nahlásit jako SPAM
IP: 87.249.133.–
KIIV
~ Moderátor
+43
God of flame
16. 1. 2010   #13
-
0
-

spis rekni o co se snazis.. pak se da odhadovat jakej algoritmus se ma pouzit

Nahlásit jako SPAM
IP: 77.237.136.–
Program vždy dělá to co naprogramujete, ne to co chcete...
Figa0
Super člen
16. 1. 2010   #14
-
0
-

Proste vygeneruj nahodne cislo a zkontroluj jestli uz neni v radku "sudoku" pokud je vygeneruj jine toto delej dokud xvalid == true

Nahlásit jako SPAM
IP: 87.249.133.–
Bald3rr0
Super člen
16. 1. 2010   #15
-
0
-

To Figa :

do {

bool xvalid = true;
array[x][y] = rand()%9;
for(int z = 0; z < 9; z++) {
if(array[x][y] == array[z][y] && x != z) {
xvalid = false;
break;
}
}
} while(!xvalid);

Nahlásit jako SPAM
IP: 82.100.0.–
Figa0
Super člen
16. 1. 2010   #16
-
0
-

To nefunguje ale nevim proc:(

Nahlásit jako SPAM
IP: 87.249.133.–
Bald3rr0
Super člen
16. 1. 2010   #17
-
0
-

To Figa : Protože jsem tam zapomněl část podmínky, viz KIIV a jeho příspěvek někde výš.

Nahlásit jako SPAM
IP: 82.100.0.–
KIIV
~ Moderátor
+43
God of flame
16. 1. 2010   #18
-
0
-

To Bald3rr : ja bych to asi videl spis na ten break :)

Nahlásit jako SPAM
IP: 77.237.136.–
Program vždy dělá to co naprogramujete, ne to co chcete...
Bald3rr0
Super člen
16. 1. 2010   #19
-
0
-

To KIIV : Ten by měl ukončit jen ten for cyklus, ne? Já vidím problém v tom, že procházím celou řádku, tedy i tu hodnotu, kterou jsem právě vygeneroval, takže ta podmínka se vždy splní.

Nahlásit jako SPAM
IP: 82.100.0.–
Figa0
Super člen
16. 1. 2010   #20
-
0
-

Ja sem si podminku doplnil hned bohuzel to nefunguje vygeneruje to sice ten radek ale s opakujicimi se cisly. Break mi rpijde spravne.

Nahlásit jako SPAM
IP: 87.249.133.–
KIIV
~ Moderátor
+43
God of flame
16. 1. 2010   #21
-
0
-

To Bald3rr : no jo ale neni v podmince takze otestuje jednou a konec ...

Nahlásit jako SPAM
IP: 77.237.136.–
Program vždy dělá to co naprogramujete, ne to co chcete...
Bald3rr0
Super člen
16. 1. 2010   #22
-
0
-

To KIIV : Už to vidim, jsem tam zapomněl závork, opraveno :)

Nahlásit jako SPAM
IP: 82.100.0.–
KIIV
~ Moderátor
+43
God of flame
16. 1. 2010   #23
-
0
-

no kdyz uz generujes jen ty radky a netrapi te skupiny a sloupce ...

for ( y =0 ; y <9 ; y++ ) {

for (z = 1; z<10; z++) {
pole[y][z-1] = z;
}

for (z = 0; z<100; z++) {
x1 = rand() % 9 ;
x2 = rand() % 9 ;

if ( x1 == x2 ) continue;

tmp = pole[y][x1];
pole[y][x1] = pole[y][x2];
pole[y][x2] = tmp;
}
}

Nahlásit jako SPAM
IP: 77.237.136.–
Program vždy dělá to co naprogramujete, ne to co chcete...
Figa0
Super člen
16. 1. 2010   #24
-
0
-

Bohuzel ja si ji tam doplnil hned ale porad to nefunguje.

Nahlásit jako SPAM
IP: 87.249.133.–
Figa0
Super člen
16. 1. 2010   #25
-
0
-

Trapi me skupiny a sloupce ale predstavoval jsem si ze do while() pridam xvalid, yvalid a svalid a kazde se bude vyhodnocovat zvlast dokud se to nenatrefi nas pravne cislo. Takze to tv nemuzu pouzit. Ted me hlavne zajima proc nejede ten kod co tady tak dlouho resime. Tdy je cely kod.



int box=0;
int z;
bool xvalid=true;
for (int a=0; a<9; a++) {
for (int b=0; b<9; b++) {
array[a]=0;
}
}
for (int x=0; x<8; x++) {
for (int y=0; y<8; y++) {
do {
xvalid = true;
array[x][y] = (rand()%9)+1;
for( z = 0; z < 8; z++) {
if(array[x][y] == array[x][z] && y != z) {
xvalid = false;
break;
}
}
} while(!xvalid);
box++;
}
}

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

To Figa : Pokud ti jde o generování sudoku, tak tohle není moc šťastné řešení (generovat náhodná čísla a zkoušet, jestli tam sedí nebo ne).
1) Nemusí se ti to vůbec vygenerovat
2) Když už se ti to podaří vygenerovat, může to trvat pěkně dlouho

Nahlásit jako SPAM
IP: 82.100.0.–
Figa0
Super člen
16. 1. 2010   #27
-
0
-

Neprislo mi ze pri generovani z 9 cisel a do 81 poli by to mohlo trvat tak dloujo. Rad si necham poradit jine reseni.

Nahlásit jako SPAM
IP: 87.249.133.–
KIIV
~ Moderátor
+43
God of flame
16. 1. 2010   #28
-
0
-

To Figa : jak sem zminoval.. jen radek kontrolovat nestaci :)

Nahlásit jako SPAM
IP: 77.237.136.–
Program vždy dělá to co naprogramujete, ne to co chcete...
Figa0
Super člen
16. 1. 2010   #29
-
0
-

Ale ja bych kontroloval i zbytek jen sem chtel nejdriv vyresit radek potom sloupecek a nakonec skupinu. Pokud nenu spravne reseni generovani nahodneho cisla, tak si necham poradit. Jo a dekuju za vasi pomoc.

Nahlásit jako SPAM
IP: 87.249.133.–
KIIV
~ Moderátor
+43
God of flame
16. 1. 2010   #30
-
0
-
Nahlásit jako SPAM
IP: 77.237.136.–
Program vždy dělá to co naprogramujete, ne to co chcete...
Bald3rr0
Super člen
16. 1. 2010   #31
-
0
-

To Figa : Úplně špatné to asi nebude, ale nebudeš mít 100% úspěšnost, někdy by se ti zkrátka nevygenerovalo. Před rokem jsem také programoval sudoku (Zasekl jsem se na lehké obtížnosti, protože se mi podařilo odebrat jen pár čísel, aby se to dalo dohrát). Nicméně jsem také vymýšlel způsob, jak celé sudoku vygenerovat. Nakonec jsem přišel na řešení pomocí priorit.
Každý řádek, sloupec a čtverec měli čísla (1 - 9), na začátku u každých bylo, že nejsou využita. Poté jsem jel postupně políčko po políčku a dělal jsem následovné:
- Zjištěný dostupných hodnot (průnik dostupných hodnot v řádku, sloupci, čtverci)
- Zjištění hodnot s větší prioritou (Projdou se čísla v sousedních sloupcích a řádcích, pokud se čísla shodují s dostupnými, zvýší se jim priorita)
- Pokud existuje alespoň jedno číslo s vyšší prioritou, vybere se mezi nimi
- Pokud neexisutje ani jedno šíslo s vyšší prioritou, vybere se mezi dostupnými.

Pokud budeš chtít, můžu sem dát i kód, který jsem k tomu napsal.

Nahlásit jako SPAM
IP: 82.100.0.–
Figa0
Super člen
16. 1. 2010   #32
-
0
-

Bald3rr napsal:
To Figa : Úplně špatné to asi nebude, ale nebudeš mít 100% úspěšnost, někdy by se ti zkrátka nevygenerovalo. Před rokem jsem také programoval sudoku (Zasekl jsem se na lehké obtížnosti, protože se mi podařilo odebrat jen pár čísel, aby se to dalo dohrát). Nicméně jsem také vymýšlel způsob, jak celé sudoku vygenerovat. Nakonec jsem přišel na řešení pomocí priorit.
Každý řádek, sloupec a čtverec měli čísla (1 - 9), na začátku u každých bylo, že nejsou využita. Poté jsem jel postupně políčko po políčku a dělal jsem následovné:
- Zjištěný dostupných hodnot (průnik dostupných hodnot v řádku, sloupci, čtverci)
- Zjištění hodnot s větší prioritou (Projdou se čísla v sousedních sloupcích a řádcích, pokud se čísla shodují s dostupnými, zvýší se jim priorita)
- Pokud existuje alespoň jedno číslo s vyšší prioritou, vybere se mezi nimi
- Pokud neexisutje ani jedno šíslo s vyšší prioritou, vybere se mezi dostupnými.

Pokud budeš chtít, můžu sem dát i kód, který jsem k tomu napsal.

To tve reseni zni zajimave. Budu rad kdyz postnes kod aspon to uplne pochopim :) a treba na tom zacnu stavet.

KIIV napsal:
nejprve zvladni udelat podminky.. kdyz doplnujes nejake cislo, aby nekolidovalo podle pravidel

nasel sem nejakou bakalarku na to tema https://dip.felk.cvut.cz/browse/pdfcache/masekj3_2007bach.pdf

Díky moc

Nahlásit jako SPAM
IP: 87.249.133.–
Bald3rr0
Super člen
16. 1. 2010   #33
-
0
-

To Figa : Koukám, že jsem to nekomentoval, takže bude asi těžší se v tom zorientovat, nicméně to funguje, přikládám i ukázkový exe soubor :)

Nahlásit jako SPAM
IP: 82.100.0.–
Figa0
Super člen
9. 3. 2010   #34
-
0
-

Uplne sme ti zapomel podekovat. Nyni mam vse hotove jen mam chybu v kontrolovani jestli se uz cislo nachazi v poli 3x3 delam to takhle a jeden ctverec ten treti od konce se vzdy vyhodnoti jako false. CIm to je?



bool valid = true;
int n =0;
int m = 0;
if(x<3 && y<3) {
for(n=0;n<3;n++) {
for(m=0;m<3;m++) {
if(unsolved[x][y]==unsolved[n][m] && x!=n && y!=m) {
valid = false;
if(!valid){break;}
}
}
if(!valid){break;}
}
}
else if(x<3 && y<6) {
for(n=0;n<3;n++) {
for(m=3;m<6;m++) {
if(unsolved[x][y]==unsolved[n][m] && x!=n && y!=m) {
valid = false;
if(!valid){break;}
}
}
if(!valid){break;}
}
}
else if(x<3 && y<9) {
for(n=0;n<3;n++) {
for(m=0;m<9;m++) {
if(unsolved[x][y]==unsolved[n][m] && x!=n && y!=m) {
valid = false;
if(!valid){break;}
}
}
if(!valid){break;}
}
}
else if(x<6 && y<3) {
for(n=3;n<6;n++) {
for(m=0;m<3;m++) {
if(unsolved[x][y]==unsolved[n][m] && x!=n && y!=m) {
valid = false;
if(!valid){break;}
}
}
if(!valid){break;}
}
}
else if(x<6 && y<6) {
for(n=3;n<6;n++) {
for(m=3;m<6;m++) {
if(unsolved[x][y]==unsolved[n][m] && x!=n && y!=m) {
valid = false;
if(!valid){break;}
}
}
if(!valid){break;}
}
}
else if(x<6 && y<9) {
for(n=3;n<6;n++) {
for(m=6;m<9;m++) {
if(unsolved[x][y]==unsolved[n][m] && x!=n && y!=m) {
valid = false;
if(!valid){break;}
}
}
if(!valid){break;}
}
}
else if(x<9 && y<3) {
for(n=6;n<9;n++) {
for(m=0;m<3;m++) {
if(unsolved[x][y]==unsolved[n][m] && x!=n && y!=m) {
valid = false;
if(!valid){break;}
}
}
if(!valid){break;}
}
}
else if(x<9 && y<6) {
for(n=6;n<9;n++) {
for(m=3;m<6;m++) {
if(unsolved[x][y]==unsolved[n][m] && x!=n && y!=m) {
valid = false;
if(!valid){break;}
}
}
if(!valid){break;}
}
}
else {
for(n=6;n<9;n++) {
for(m=6;m<9;m++) {
if(unsolved[x][y]==unsolved[n][m] && x!=n && y!=m) {
valid = false;
if(!valid){break;}
}
}
if(!valid){break;}
}
}

Nahlásit jako SPAM
IP: 87.249.133.–
Bald3rr0
Super člen
9. 3. 2010   #35
-
0
-

To Figa : Tohle mi nepřijde jako moc elegenantní řešení, hádám, že tohle je součást cyklu, kterej prochází všechny políčka? Udělal bych to spíš nějak takto

for(x = 0; x < 9; x+=3) {

for(y = 0; y < 9; y+=3) {
int iSqr[9];
int index = 0;
for(int i = x; i < x+3; i++) {
for(int n = y; n < y+3; n++) {
iSqr[index++] = unsolved[i][n];
}
}
// Nějaká fce, která zjistí, jestli nejsou v poli dvě stejná čísla
if(!CorrectSqr(iSqr) return false;
}
}

return true;


}

Nahlásit jako SPAM
IP: 82.100.0.–
Figa0
Super člen
9. 3. 2010   #36
-
0
-

Dekuji.Většinou kontroluje jen jedno číslo. Tohle je sice zajimave ale neurci mi to presne jake policko v poli[9][9] je spatne.

Nahlásit jako SPAM
IP: 87.249.133.–
Bald3rr0
Super člen
9. 3. 2010   #37
-
0
-

To Figa : Tak to můžeš udělat takto:

// Místo iSqr

struct SSQUARE {
POINT Coord;
int iNumber;
};

// Místo Pole[9][9]
struct SNUMBERS {
int iNumber;
bool bOK;
};

//...
//stejné for cykly, akorát místo Sqr[index++] = unsolved[i][n];
sSqr[index].iNumber = unsolved[i][n];
sSqr[index].Coord.x = i;
sSqr[index++].Coord.y = n;

// Fce Correct bude brát ještě pole[9][9]

if(!CorrectSqr(sSqr, sPole)) return false;

// Fce CorrectSqr(SSQUARE *pSqr, SNUMBERS **ppNumbers) by mohla vypadat nějak takto
bool CorrectSqr(SSQUARE *pSqr, SNUMBERS **ppNumbers) {
bool bReturnValue = true;
for(int i = 0; i < 9; i++) {
for(int n = i+1; n < 9; n++) {
if(pSqr[i].iNumber == pSqr[n].iNumber) {
ppNumbers[pSqr[i].Coord.x][pSqr[i].Coord.y].bOK = false;
ppNumbers[pSqr[n].Coord.x][pSqr[n].Coord.y].bOK = false;
bReturnValue = false;
}
}
}
return bReturnValue;
}

Nahlásit jako SPAM
IP: 82.100.0.–
Figa0
Super člen
9. 3. 2010   #38
-
0
-

Toto je jeste lepsi reseni bohuzel ho nemohu pouzit znamenalo yb to zmenit strukturu cele aplikace a kopirovani hodnot pole[9][9] do struktury jen kvuli kontrole mi neprijde spravne. Diky za inspiraci snad se s tim nejak poperu.

Nahlásit jako SPAM
IP: 87.249.133.–
Bald3rr0
Super člen
9. 3. 2010   #39
-
0
-

To Figa : Tak si můžeš vytvořit další proměnou (tady by byl asi nejlepší nějakej seznam), kam bude umisťovat souřadnice a hodnotu špatných čísel :)

Nahlásit jako SPAM
IP: 82.100.0.–
Figa0
Super člen
9. 3. 2010   #40
-
0
-

To uz muzu rovnou udelat copy toho pole do struktury:)

Nahlásit jako SPAM
IP: 87.249.133.–
Figa0
Super člen
9. 3. 2010   #41
-
0
-

Mam jeste dotaz proc nefungovalo to moje prasacke reseni?

Nahlásit jako SPAM
IP: 87.249.133.–
Bald3rr0
Super člen
9. 3. 2010   #42
-
0
-

To Figa : Žádnou chybu jsem tam nenašel, nahoď breakpoint a debugguj, uvidíš, co tam bude za problém :)

Nahlásit jako SPAM
IP: 82.100.0.–
Figa0
Super člen
9. 3. 2010   #43
-
0
-

JJ zkusim mne je jen divny ze to vyhodnocuje spravne pro kazdy ctverec a jen pro treti v prvni rade ne...

Nahlásit jako SPAM
IP: 87.249.133.–
Bald3rr0
Super člen
9. 3. 2010   #44
-
0
-

To Figa : Jsem pochopil výraz "třetí od konce" jinak, teď tam tu chybu vidim hned... řádka 29 (máš y od 0 do 9)

Nahlásit jako SPAM
IP: 82.100.0.–
Figa0
Super člen
10. 3. 2010   #45
-
0
-

Moc se omlouvam a mnohokrat dekuji. Cucim do toho cely den nejsem schopen najit chybu.

Nahlásit jako SPAM
IP: 89.24.6.–
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, 10 hostů

Moderátoři diskuze

 

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