Backtracking

Diese Seite verwendet Cookies. Durch die Nutzung unserer Seite erklären Sie sich damit einverstanden, dass wir Cookies setzen. Weitere Informationen

  • du meinst Beispiele für den Backtracking Algorithmus.

    Also ich hab mittels Backtracking noch zusätzlich Sudoku und das Nikolaushaus implementiert

    Wikipedia hat diese Beispiele:
    Damenproblem
    Gegeben ist ein Schachbrett mit n*n Feldern (je n Spalten und Reihen). Man positioniere nun n Damen so, dass sie sich nicht gegenseitig schlagen können.

    Springerproblem
    Gegeben ist ein „Schachbrett“ mit m\times n Feldern. Ein Springer kann von einer bestimmten Position aus N = 8 verschiedene Sprünge ausführen, falls diese nicht über den Rand des Brettes hinausführen. Gesucht ist ein Weg, bei dem alle Felder genau einmal besucht werden (Springerweg). Mit Hilfe von Backtracking können alle möglichen Wege systematisch durchprobiert werden. Ein Zug ist dabei gültig, wenn das neue Feld innerhalb des Spielfeldes liegt und noch unbesucht ist. Es gibt jedoch weitaus effizientere Verfahren für die Lösung dieses Problems. Siehe Programmbeispiel (Java-Applet) weiter unten.

    Rucksackproblem
    Gegeben ist ein Rucksack mit der Tragfähigkeit B. Weiterhin sind N Gegenstände mit Werten und Gewichten gegeben. Nun sollen Gegenstände so ausgewählt werden, die in der Summe einen maximalen Wert ergeben, aber deren Gesamtgewicht die Tragfähigkeit des Rucksacks nicht überschreitet.

    Färbe-/ Kartenproblem
    Gegeben ist eine Landkarte mit B Ländern, welche mit N verschiedenen Farben eingefärbt werden sollen. Gesucht ist eine Farbkombination, bei welcher alle Länder, die eine gemeinsame Grenze besitzen, unterschiedlich eingefärbt sind.

    Lösungen des Solitär-Brettspiels
    Die Lösungen des bekannten alten Brettspiels können gut mit Backtracking ermittelt werden. Zu Beginn stehen 32 Steine (Stifte oder Kugeln) auf dem Brett; davon werden in 31 Zügen je einer entfernt, indem man ihn mit einem anderen Stein überspringt.

    Wegsuche von A nach B in einem Graph
    Backtracking wird auch eingesetzt für die Wegsuche von A nach B in einem Graph, z.B. für die Suche nach Verbindungen in einem Fahrplan oder zum bestimmen einer Route in einem Routenplaner oder eines Weges durch ein Labyrinth.
  • Ja super vielen Dank

    Dame Springer und Rucksack habe ich fertig ich sitze jetzt seit 2 Tagen in Sudoku und
    möchte mir halt alle möglichen Lösungen ausgeben lassen beid er Dame war das ja nicht das Problem nur hier sehe ich kein Land
    vielleicht habt ihr eine Idee

    Gruß T

    Quellcode

    1. public class Sudo {
    2. public Sudo(int size){
    3. this.size = size;
    4. feld = new int [size][size];
    5. }
    6. public boolean check(int i, int j, int[][] cells){
    7. if (i == 9) {
    8. i = 0;
    9. j++;
    10. if (j == 9){
    11. writeMatrix();
    12. reset();
    13. return true;
    14. }
    15. }
    16. if (cells[i][j] != 0){
    17. return check(i+1,j,cells);
    18. }
    19. int val = 1;
    20. for (val = 1; val <= 9; ++val) {
    21. if (legal(i,j,val,cells)) {
    22. cells[i][j] = val;
    23. if (check(i+1,j,cells)){
    24. return true;
    25. }
    26. }
    27. }
    28. cells[i][j] = 0;
    29. return false;
    30. }
    31. private boolean legal(int i,int j,int val,int[][]cells){
    32. //check ob Wert schon vorhanden ist in der Reihe
    33. for (int k = 0; k < size; ++k)
    34. if (val == cells[k][j])
    35. return false;
    36. //check ob Wert schon vorhanden ist in der Spalte
    37. for (int k = 0; k < 9; ++k)
    38. if (val == cells[i][k])
    39. return false;
    40. int boxRowOffset = (i / 3)*3;
    41. int boxColOffset = (j / 3)*3;
    42. for (int k = 0; k < 3; ++k) // box
    43. for (int m = 0; m < 3; ++m)
    44. if (val == cells[boxRowOffset+k][boxColOffset+m])
    45. return false;
    46. return true; // no violations, so it's legal
    47. }
    48. static void writeMatrix() {
    49. for (int i = 0; i < feld.length; i++) {
    50. if(i%3==0){
    51. System.out.println("-------------------------");
    52. }
    53. for (int j = 0; j < feld.length; j++) {
    54. if(j%3==0){
    55. System.out.print("| ");
    56. }
    57. System.out.print(feld[i][j]+" ");
    58. }
    59. System.out.print("|");
    60. System.out.println();
    61. }
    62. System.out.println("-------------------------");
    63. }
    64. void reset() {
    65. for(int y=0;y<feld.length;y++)
    66. for(int x=0;x<feld.length;x++)
    67. feld[x][y]=0;
    68. }
    69. private static int[][]feld;
    70. private int size;
    71. public static void main(String[] args) {
    72. Sudo s = new Sudo(9);
    73. while(s.check(0,0,s.feld)){
    74. }
    75. }
    76. }
    Alles anzeigen