Herzlich Willkommen, lieber Gast!
  Sie befinden sich hier:

  Forum » Rätselecke » Sudoku Check Rätsel

Forum | Hilfe | Team | Links | Impressum | > Suche < | Mitglieder | Registrieren | Einloggen
  Quicklinks: MSDN-Online || STL || clib Reference Grundlagen || Literatur || E-Books || Zubehör || > F.A.Q. < || Downloads   

Autor Thread - Seiten: [ 1 ] > 2 <
010
11.12.2006, 18:10 Uhr
virtual
Sexiest Bit alive
(Operator)


Na dann:

C++:
bool f() //Überprüfungsfunktion
{
    int z,y,x,u;
    for(z=y=x=0; z<9;++z)
        for(;y<9;++y) {
            u=(1<<m[z][y])+(1024<<m[y/3+3*(z/3)][y%3+3*(z%3)])+(1<<20<<m[y][z]);            
            if(x&u) return 0;
            x|=u;
        }
    return 1;
}


Zur erkläsung:
z Wird gleichzeitig als Linien/Spalten/oder Unterquadrat index angesehen.
y Wird entsprechen as Spalten/Linien/oder Feld im Unterquadrat angesehen, in Abh. von z.

x Beinhaltet eine Bitmaske:
In den bits 1-10 wird für jede zahl, welche in der zeile z vorkommt, das entsprechende bit gesetzt
In den bits 11-20 wird für jede zahl, welche in der Spalte z vorkommt das entsprechende bit gesetzt.
In den bits 21-30 wird für jede zahl, welche im Unterquadrat z vorkommt das entsprechende bit gesetzt.

Die pro Durchlauf der inneren Schleife zu setzenden Bits werden in u zunächst zwischengespeichert. Haben u und x bits gemeinsam, dann kommt eine Zahl dopplet vor ( rückgabe false).
Am ende der inneren Schleife sollte also x den Wert 0x3feffbfe enthalten. Dies wäre ein alternativer (jedoch längerer) Test.
--
Gruß, virtual
Quote of the Month
Ich eß' nur was ein Gesicht hat (Creme 21)
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
011
11.12.2006, 18:13 Uhr
virtual
Sexiest Bit alive
(Operator)



C++:
return g>243?false:true;


Besser:

C++:
return g<=243;


--
Gruß, virtual
Quote of the Month
Ich eß' nur was ein Gesicht hat (Creme 21)
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
012
11.12.2006, 18:31 Uhr
Lensflare



deine Lösung scheint leider nicht zu stimmen:
probiere mal folgende Matrix aus:

C++:
const int m[9][9] =
{
  {6,5,2, 9,3,7, 8,1,4},
  {1,8,7, 5,4,6, 3,2,9},
  {3,4,9, 8,2,1, 5,6,7},

  {5,7,4, 6,9,8, 1,3,2},
  {9,2,1, 7,5,3, 4,8,6},
  {8,3,6, 2,3,4, 9,7,5}, //in der mitte 3 statt 1

  {7,1,8, 4,6,5, 2,9,3},
  {4,9,3, 1,7,2, 6,5,8},
  {2,6,5, 3,8,9, 7,4,1}
};


auch für andere falsche Werte im mittleren Quardat gibt die Funktion true zurück
--
Wenn das Gehirn so einfach wäre, dass wir es verstehen könnten, wären wir so einfach, dass wir es nicht verstehen könnten.
(Emerson Pugh Trost)
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
013
11.12.2006, 18:37 Uhr
Lensflare




Zitat von virtual:

Besser:
return g<=243;


stimmt.
-> 180

EDIT:
oder noch besser:
return g<244;
-> 179
--
Wenn das Gehirn so einfach wäre, dass wir es verstehen könnten, wären wir so einfach, dass wir es nicht verstehen könnten.
(Emerson Pugh Trost)

Dieser Post wurde am 11.12.2006 um 18:49 Uhr von Lensflare editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
014
11.12.2006, 21:43 Uhr
kronos
Quotenfisch
(Operator)


143 und durchaus noch optimierbar:

C++:
int x,y,z=0,a,b=0;for(;z<9;++z){for(a=x=0;x<9;++x
)a|=(1<<m[z][x])|(512<<(m[x][z]))|(1<<(m[z/3*3+x/3]
[z%3*3+x%3]+18));b|=a^0xffffffe;}return!b;

Leider jedoch des selbe Ansatz wie virtual :-/
--
main($)??<-$<='?'>>2?main($-!!putchar(
(("$;99M?GD??(??/x0d??/a:???;a"+'?'/4)
??($??)+'?'/3-2-1+$%2)??''?')):'?';??>

Dieser Post wurde am 11.12.2006 um 21:44 Uhr von kronos editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
015
12.12.2006, 10:00 Uhr
virtual
Sexiest Bit alive
(Operator)



Zitat von Lensflare:
deine Lösung scheint leider nicht zu stimmen:


Das ist auffällig richtig. Da habe ich versucht zuviel mit den Variableninitialisierungen zu sparen. Nächster versuch:

C++:
int z,y,x,u;
for(z=0;z<9;++z)
    for(y=x=0;y<9;++y){
        u=1<<m[z][y]|512<<m[y][z]|1<<18<<m[y/3+z/3*3][y%3+z%3*3];
        if(x&u)return 0;
        x|=u;
    }
return 1;


Durch Optimirungen an anderer Stelle komme ich jetzt sogar auf 135.

Scheint mir zumindest korrekter zu sein.
--
Gruß, virtual
Quote of the Month
Ich eß' nur was ein Gesicht hat (Creme 21)

Dieser Post wurde am 12.12.2006 um 10:06 Uhr von virtual editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
016
14.12.2006, 19:23 Uhr
kronos
Quotenfisch
(Operator)



C++:
int x,z=0,a,b=0;for(;z<9;++z){for(a=(1<<28)-2,x=9;x--;)
a^=1<<m[z][x]|512<<m[x][z]|1<<m[z/3*3+x/3][z%3*3+x%3]
+18;b|=a;}return!b;

128!
--
main($)??<-$<='?'>>2?main($-!!putchar(
(("$;99M?GD??(??/x0d??/a:???;a"+'?'/4)
??($??)+'?'/3-2-1+$%2)??''?')):'?';??>
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
Seiten: [ 1 ] > 2 <     [ Rätselecke ]  


ThWBoard 2.73 FloSoft-Edition
© by Paul Baecher & Felix Gonschorek (www.thwboard.de)

Anpassungen des Forums
© by Flo-Soft (www.flo-soft.de)

Sie sind Besucher: