Hackerboard WikiHaboBlog

[HaBo]

 
Programmieraufgaben Hier wird regelmäßig eine neue Programmieraufgabe gestellt, die dann gelöst werden soll und in Zusammenarbeit mit den Moderatoren auch besprochen werden kann.

Sudoku Cheat-Prog.

Diskussion: Sudoku Cheat-Prog. im Forum Programmieraufgaben, in der Kategorie Code Kitchen; Zitat: Original von Elderan ermutlich eh nicht verstehen wirst und es leichter ist ein Programm/Algorithmus nachzuvollziehen. trotzdem vielen dank fuer ...

Antwort
Alt 27.10.08, 11:16   #31 (permalink)
 
Registriert seit: 19.01.07
Joiseppe Leistung: Facit NTK
Likes: 2
Standard


Zitat:
Original von Elderan
ermutlich eh nicht verstehen wirst und es leichter ist ein Programm/Algorithmus nachzuvollziehen.
trotzdem vielen dank fuer die einteilung in diese schublade,
ich brauchs fuer nen mathelehrer...
Joiseppe ist offline   Mit Zitat antworten
Alt 27.10.08, 14:29   #32 (permalink)
Moderator
Themenstarter
 
Benutzerbild von Elderan
 
Registriert seit: 30.03.04
Elderan Leistung: 8086
Likes: 14
Standard

Hallo,
Zitat:
Original von Joiseppe
Zitat:
Original von Elderan
ermutlich eh nicht verstehen wirst und es leichter ist ein Programm/Algorithmus nachzuvollziehen.
trotzdem vielen dank fuer die einteilung in diese schublade,
ich brauchs fuer nen mathelehrer...
Das hat nichts mit der Einteilung in Schubladen zu tun, aber wie bereits erwähnt, selbst simple Sachen lassen sich mathematisch nur so komplex beschreiben, dass sie 99,9[...]% der Menschen nicht verstehen.

Ein simples Beispiel ist, wie man Orangen möglichst platzsparend stapeld: Orangenstapel
Zu beweisen, dass man eine Pyramide bilden muss, dazu benötigt man hunderte von Seiten an höchster Mathematik.


Ebenso simple Sachen wie zu beweisen, dass der Kreis einen eindeutigen Flächeninhalt hat bzw, dass dieser überhaupt einen Flächeninhalt hat [1] ist höchst ansprechend, so dass kaum ein Schüler überhaupt das Problem versteht. Das fängt an beim Begriff der Sigma-Algebra geht über Borel Algebra, Maßräume, Lesbegue Maß, Maßfortsetzung etc., oder kurz: Maßtheorie

Und nun möchtest du mir erzählen, dass du in der Lage bist, mathematische Formeln/Sätze/Definitionen zu verstehen? Mathematik ist viel mehr als nur die Formel A = \pi * r^2.

Ein ganz simple 'Formel' zur Beschreibung wie sich Jäger und Beute in einem geschlossenen Ökosystem verhält wäre:
y(t) := Anzahl der Jäger zum Zeitpunkt t
z(t) := Anzahl der Beute zum Zeitpunkt t

y'(t) = a*y(t) + b(z(t)-c)
z'(t) = d*z(t) + e*y(t)

a := Geburtenrate Jäger > 0
b, c := Schwellenwerte, > 0
d := Geburtenrate Beute > 0
e := Fressrate < 0

Wenn nun a,b,c,d,e gegeben ist, dann lässt sich eine explizite Formel für y und z finden, so dass man sagen kann, nach t Zeiteinheiten gibt es ... Jäger und ... Beutetiere. Es ist also keine Formel für y oder z(t) vorgegeben, sondern die lässt sich dann so bestimmen.




[1] es gibt auch Flächen/Mengen in den reellen Zahlen (R^2), die keinen Flächeninhalt haben, also weder die Fläche 0 noch irgendein einen anderen Flächeninhalt. Nennen sich Vitali-Mengen)
Elderan ist offline   Mit Zitat antworten
Alt 11.10.09, 14:10   #33 (permalink)
 
Registriert seit: 11.10.09
Gaux Leistung: Facit NTK
Likes: 0
Standard

hab das auch mal gecodet in VB.NET.
Ich hab jetzt einfach mal ein SudokuFeld (als Array) initialisiert das komplett leer ist.
Das Programm braucht 0.0156250 Sekunden um es aufzulösen (also ca. 16 Millisekunden wenn ich das richtig seh?)

Hier der Lösungsalgorithmus:

Code:
Private field(9, 9) As Integer
Private line As Integer = 0

Public Function solve() As Boolean
        For x As Integer = line To 8
            For y As Integer = 0 To 8
                'Wenn das aktuelle Feld nicht besetzt ist
                If field(x, y) = 0 Then
                    For val As Integer = 1 To 9
                        'Setze Zahl
                        field(x, y) = val
                        'Wenn Zahl gültig ist
                        If fieldValid() Then
                            line = x
                            'rekursiver Aufruf
                            If solve() Then
                                'wenn gesetzte Zahl richtig war -> beende Schleife
                                'wenn nicht -> setze Schleife fort = setze nächste Zahl in Feld
                                Exit For
                            End If
                        'Wenn die Zahl nicht gültig ist
                        Else
                            'Wenn die Zahl im aktuellen Feld 9 ist -> setze Feld zurück
                            'und return false
                            If val = 9 Then
                                field(x, y) = 0
                                Return False
                            End If
                        End If
                    Next
                End If
            Next
        Next
        Return True
    End Function
und hier noch die Funktion zur Überprüfung auf Gültigkeit:

Code:
    Private Function fieldValid() As Boolean
        Dim numbers1to9(9) As Integer
        numbers1to9(1) = 0
        numbers1to9(2) = 0
        numbers1to9(3) = 0
        numbers1to9(4) = 0
        numbers1to9(5) = 0
        numbers1to9(6) = 0
        numbers1to9(7) = 0
        numbers1to9(8) = 0
        numbers1to9(9) = 0
        Dim i As Integer
        Dim j As Integer

        '---------Überprüfung aller 3x3 Kasten------------------
        For i = 0 To 6 Step 3   'x
            For j = 0 To 6 Step 3   'y
                For k As Integer = j To j + 2 Step 1 'y
                    For l As Integer = i To i + 2 Step 1 'x
                        'Wenn das aktuelle Feld 1-9 als Inhalt hat -> Erhöhund des entsprechenden Zählers
                        If field(k, l) = 1 Or field(k, l) = 2 Or field(k, l) = 3 _
                        Or field(k, l) = 4 Or field(k, l) = 5 Or field(k, l) = 6 _
                        Or field(k, l) = 7 Or field(k, l) = 8 Or field(k, l) = 9 Then
                            numbers1to9(field(k, l)) += 1
                        End If
                    Next
                Next
                'Wenn eine Zahl öfters als ein mal vor kommt -> ungültig
                If numbers1to9(1) > 1 OrElse numbers1to9(2) > 1 OrElse numbers1to9(3) > 1 _
                OrElse numbers1to9(4) > 1 OrElse numbers1to9(5) > 1 OrElse numbers1to9(6) > 1 _
                OrElse numbers1to9(7) > 1 OrElse numbers1to9(8) > 1 OrElse numbers1to9(9) > 1 Then
                    Return False
                End If
                numbers1to9(1) = 0
                numbers1to9(2) = 0
                numbers1to9(3) = 0
                numbers1to9(4) = 0
                numbers1to9(5) = 0
                numbers1to9(6) = 0
                numbers1to9(7) = 0
                numbers1to9(8) = 0
                numbers1to9(9) = 0
            Next
        Next
        '-------------------------------------------------------------------

        '---------Überprüfung aller Reihen nacht unten----------------------
        For i = 0 To 8
            For j = 0 To 8
                'Wenn das aktuelle Feld 1-9 als Inhalt hat -> Erhöhund des entsprechenden Zählers
                If field(i, j) = 1 Or field(i, j) = 2 Or field(i, j) = 3 _
                    Or field(i, j) = 4 Or field(i, j) = 5 Or field(i, j) = 6 _
                    Or field(i, j) = 7 Or field(i, j) = 8 Or field(i, j) = 9 Then
                    numbers1to9(field(i, j)) += 1
                End If
            Next
            'Wenn eine Zahl öfters als ein mal vor kommt -> ungültig
            If numbers1to9(1) > 1 OrElse numbers1to9(2) > 1 OrElse numbers1to9(3) > 1 _
                OrElse numbers1to9(4) > 1 OrElse numbers1to9(5) > 1 OrElse numbers1to9(6) > 1 _
                OrElse numbers1to9(7) > 1 OrElse numbers1to9(8) > 1 OrElse numbers1to9(9) > 1 Then
                Return False
            End If
            numbers1to9(1) = 0
            numbers1to9(2) = 0
            numbers1to9(3) = 0
            numbers1to9(4) = 0
            numbers1to9(5) = 0
            numbers1to9(6) = 0
            numbers1to9(7) = 0
            numbers1to9(8) = 0
            numbers1to9(9) = 0
        Next
        '----------------------------------------------------------------------

        '----------- Überprüfung aller Reihen nach Rechts----------------------
        For i = 0 To 8
            For j = 0 To 8
                'Wenn das aktuelle Feld 1-9 als Inhalt hat -> Erhöhund des entsprechenden Zählers
                If field(j, i) = 1 Or field(j, i) = 2 Or field(j, i) = 3 _
                   Or field(j, i) = 4 Or field(j, i) = 5 Or field(j, i) = 6 _
                   Or field(j, i) = 7 Or field(j, i) = 8 Or field(j, i) = 9 Then
                    numbers1to9(field(j, i)) += 1
                End If
            Next
            'Wenn eine Zahl öfters als ein mal vor kommt -> ungültig
            If numbers1to9(1) > 1 OrElse numbers1to9(2) > 1 OrElse numbers1to9(3) > 1 _
                OrElse numbers1to9(4) > 1 OrElse numbers1to9(5) > 1 OrElse numbers1to9(6) > 1 _
                OrElse numbers1to9(7) > 1 OrElse numbers1to9(8) > 1 OrElse numbers1to9(9) > 1 Then
                Return False
            End If
            numbers1to9(1) = 0
            numbers1to9(2) = 0
            numbers1to9(3) = 0
            numbers1to9(4) = 0
            numbers1to9(5) = 0
            numbers1to9(6) = 0
            numbers1to9(7) = 0
            numbers1to9(8) = 0
            numbers1to9(9) = 0
        Next
        '----------------------------------------------------------------------

        Return True
    End Function

Ich hab das ganze auch mal gecodet mit Algorithmen die das Sudoku durch Logik lösen (und Trial&Error falls mit Logik nichts mehr geht). Der Code ist allerdings wesentlich länger. Aber falls jemand Interesse hat kann ich den ja auch mal posten.

P.S.: Wie kann man hier Hide machen? Find des ned
Gaux ist offline   Mit Zitat antworten
Alt 12.04.10, 19:09   #34 (permalink)
 
Registriert seit: 27.07.09
fishfishfish Leistung: Facit NTK
Likes: 0
Standard

Bruteforce, C++, unspektakulär
Code:
#include <iostream>
const int K = 3;	//Kasten
const int D = K*K;	//Seitenlaenge
short feld[D][D];

inline bool test(int x, int y)
{
	for(int i = 0; i< D; i++)
	{
		if( ((feld[x][y] == feld[i][y]) && (x!=i)) || ((feld[x][y] == feld[x][i]) && (y!=i))    ) return false;
	}
	for(int ix = (x/K) *K; ix < (x/K+1)*K; ix++)
	for(int iy = (y/K) *K; iy < (y/K+1)*K; iy++)
		if(ix != x && iy != y && feld[x][y] == feld[ix][iy]) return false;
}

bool fill(int x, int y)
{
	if(y == D)		
		return true;
	if(feld[x][y] == 0)
	{
		for(int i = 1; i < D+1; i++)
		{
			feld[x][y] = i;
			if(test(x,y))
				if(fill((x+1)%D, y+(x+1)/D)) return true;
		}
		feld[x][y] = 0; 
		return false;
	}
	else		
		return test(x,y) ? fill((x+1)%D, y+(x+1)/D) : false;
}

void main()
{
	std::cout << "\n \n Zahl fuer Zahl (Zeilenweise; 0 = frei):\n";
	for(int iy = 0; iy < D; iy++)
	for(int ix = 0; ix < D; ix++)
		std::cin >> feld[ix][iy];
	if(fill(0,0))
		for(int iy = 0; iy < D; iy++)
		{
			std::cout << "\n";
			if(iy%K == 0) std::cout << "\n";
			for(int ix = 0; ix < D; ix++)
			{
				if(ix%K == 0) std::cout << " ";
				std::cout << feld[ix][iy] << " ";
			}
		}
	else
		std::cout << "Es sind Unstimmigkeiten in der Vorgabe.";
	std::cout << "\n";
	std::cin >> feld[0][0];
}
mfg fish
fishfishfish ist offline   Mit Zitat antworten
Antwort
   

Werbung ist gerade online    

[HaBo] » Software Home » Code Kitchen » Programmieraufgaben » Sudoku Cheat-Prog.
Themen-Optionen
Ansicht

Forumregeln
Es ist Ihnen nicht erlaubt, neue Themen zu verfassen.
Es ist Ihnen nicht erlaubt, auf Beiträge zu antworten.
Es ist Ihnen nicht erlaubt, Anhänge hochzuladen.
Es ist Ihnen nicht erlaubt, Ihre Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks sind aus
Pingbacks sind aus
Refbacks sind aus


Ähnliche Themen
Thema Autor Forum Antworten Letzter Beitrag
Sudoku-Generator CDW Programmieraufgaben 1 04.08.09 02:12
Sudoku Ook! Code Kitchen 2 25.05.08 11:00
The Cheat Report stone.dr Fun Section 17 20.03.06 15:18
Sudoku programmieren jami Code Kitchen 1 16.10.05 15:05


1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61