Buch Cover Buch Cover Buch Cover Buch Cover

Web-Code: - Webcode Help

Springer auf dem Schachbrett (Felder)

Der Anwender wird vom Programm nach einer Position auf dem Schachbrett gefragt (z. B. "c1"). Ab dieser Startposition berechnet nun das Programm für jedes andere Feld (= Zielposition) die Anzahl Züge, die der Springer minimal benötigt, um diese Zielposition zu erreichen. Geben Sie das Resultat als Tabelle aus.

Bemerkung: An der Startposition des Springers steht bei der Ausgabe natürlich eine Null.

0 Kommentare

Bitte melde dich an um einen Kommentar abzugeben

2 Lösung(en)

public class Main {

    public static void main(String[] args) {

        // Initialisierung des Schachbretts mit je 2 Randfeldern
        // Es geht dann nie ein Sprung ins "Offside", was beim
        // Springen etwas Arbeit spart
        int i, j;
        int[][] f = new int[12][12];
        i = 0;
        while( i < 12 ) {
            j = 0;
            while( j < 12 ) {
                // Jedes Feld zunächst mit 99 füllen.
                f[i][j] = 99;
                j = j + 1;
            }
            i = i + 1;
        }
        int curDist = 0;
        boolean done = false;
        f[2][4] = 0;  // Das Startfeld

        
        while( !done ) {
            done = true; // Vielleicht schon fertig?
            i = 2;
            while ( i < 10 ) {
                j = 2;
                while( j < 10 ) {
                    // Für jedes der gültigen 64 Felder...
                    if ( f[i][j] == curDist ) {
                        // neuste Ausgangsposition gefunden
                        done = false; // und deshalb noch nicht fertig.
                        if ( f[i+2][j+1] > curDist ) f[i+2][j+1] = curDist+1;
                        if ( f[i-2][j+1] > curDist ) f[i-2][j+1] = curDist+1;
                        if ( f[i+2][j-1] > curDist ) f[i+2][j-1] = curDist+1;
                        if ( f[i-2][j-1] > curDist ) f[i-2][j-1] = curDist+1;
                        if ( f[i+1][j+2] > curDist ) f[i+1][j+2] = curDist+1;
                        if ( f[i-1][j+2] > curDist ) f[i-1][j+2] = curDist+1;
                        if ( f[i+1][j-2] > curDist ) f[i+1][j-2] = curDist+1;
                        if ( f[i-1][j-2] > curDist ) f[i-1][j-2] = curDist+1;
                    }
                    j = j + 1;
                }
                i = i + 1;
            }
            curDist = curDist + 1;
        }

        // Ausgabe des Spielfeldes
        i = 2;
        while( i < 10 ) {
            j = 2;
            while( j < 10 ) {
                System.out.printf( "%2d ", f[i][j] );
                j = j + 1;
            }
            System.out.println( );
            i = i + 1;
        }        
    }
}
                
// Lösung Dammer, 13.8.2011
// das Konsolenfenster muss geöffnet sein

import java.util.Scanner;

class SpringerAufSchachbrettDm{
  Scanner sc=new Scanner(System.in);
  int n=8;                                                     // für 8x8 Schachbrett

  void los()
    {

    // Startfeld eingeben
    System.out.println("Geben Sie ein Startfeld ein, a1 bis h8");
    String input=sc.next();
    System.out.println();
    int x0=(int)(input.charAt(0)-'a');                      // Anfangsspalte 0..7
    int y0=(int)(input.charAt(1)-'0'-1);                    // Anfangsreihe 0..7

    // Array initialisieren
    int[][] feld=new int[n][n];
    feld[x0][y0]=1;                                         // 0 Feld unbetreten, 1 im 1. Schritt

    // dynamisch die Entfernung aller Felder vom Anfangsfeld bestimmen
    int counter=1;                                                         // Anzahl schon besuchter Felder
    for(int suchNummer=1;suchNummer<n*n && counter<n*n; suchNummer++){     // welche Sprünge sind von "1" möglich..
      for (int x=0; x<n; x++)
        for (int y=0; y<n; y++){
          if (feld[x][y]==suchNummer){
            if (x<n-1 && y<n-2 && feld[x+1][y+2]==0) {feld[x+1][y+2]=suchNummer+1;counter++;}    // oben rechts
            if (x<n-2 && y<n-1 && feld[x+2][y+1]==0) {feld[x+2][y+1]=suchNummer+1;counter++;}    // rechts oben
            if (x<n-2 && y>0 && feld[x+2][y-1]==0) {feld[x+2][y-1]=suchNummer+1;counter++;}      // rechts unten
            if (x<n-1 && y>1 && feld[x+1][y-2]==0) {feld[x+1][y-2]=suchNummer+1;counter++;}      // unten rechts
            if (x>0 && y>1 && feld[x-1][y-2]==0) {feld[x-1][y-2]=suchNummer+1;counter++;}        // unten links
            if (x>1 && y>0 && feld[x-2][y-1]==0) {feld[x-2][y-1]=suchNummer+1;counter++;}        // links unten
            if (x>1 && y<n-1 && feld[x-2][y+1]==0) {feld[x-2][y+1]=suchNummer+1;counter++;}      // links oben
            if (x>0 && y<n-2 && feld[x-1][y+2]==0) {feld[x-1][y+2]=suchNummer+1;counter++;}      // oben links
            }
          }
      }

    // Ausgabe
    for (int y=n-1;y>=0; y--) {
        for (int x=0; x<n; x++) System.out.print(feld[x][y]-1+" ");
        System.out.println();
    }
  }


  public static void main(String[] args)
    {
    new SpringerAufSchachbrettDm().los();
    }

}

                

Lösung von: Name nicht veröffentlicht

Verifikation/Checksumme:

Beispiel auf dem 4x4 Brett:

\begin{displaymath} \left( \begin{array}{cccc} 3 & 0 & 3 & 2 \\ 2 & 3 & 2 & 1 \\ 1 & 2 & 1 & 4 \\ 2 & 3 & 2 & 3 \\ \end{array} \right) \end{displaymath}

Aktionen

Bewertung

Durchschnittliche Bewertung:

Eigene Bewertung:
Bitte zuerst anmelden

Meta

Zeit: 2
Schwierigkeit: k.A.
Webcode: o9zn-pwdy
Autor: Philipp G. Freimann (BBW (Berufsbildungsschule Winterthur) https://www.bbw.ch)

Zu Aufgabenblatt hinzufügen