Visualizzazione dei risultati da 1 a 5 su 5
  1. #1
    Utente di HTML.it L'avatar di LuckySevenRoX
    Registrato dal
    Sep 2011
    residenza
    Foligno
    Messaggi
    361

    [JAVA] Il giro del cavallo

    salve, ho sviluppato 1 piccolo programmino che "tenta" di risolvere il giro del cavallo (per chi non lo sapesse è un algoritmo che calcola quale strada deve fare il cavallo su una scacchiera per toccare tutte le caselle una volta sola)..

    Per completare il giro il cavallo deve compiere 64 passi, ma... quanto ci mette?

    Il programma nella sua ricorsività funziona, perchè se provo a limitare il numero di passi a 58 vedo che funziona.. ma già a 59 passi ci mette 2 minuti e qualcosa per arrivare all'ultimo movimento..

    La mia domanda a questo punto è: è normale che ci mette tutto questo tempo? facendo un paio di calcoli le combinazioni per arrivare al 64° passo sono tante quindi può anche starci.. ma magari sto facendo un casino! Domani vi posto il sorgente (ora sono su un altro computer).. se però devo stare tranquillo che ci vuole tanto ditelo subito

  2. #2
    Moderatore di Programmazione L'avatar di alka
    Registrato dal
    Oct 2001
    residenza
    Reggio Emilia
    Messaggi
    24,462
    Originariamente inviato da LuckySevenRoX
    Domani vi posto il sorgente (ora sono su un altro computer).. se però devo stare tranquillo che ci vuole tanto ditelo subito
    E' inutile anticipare il problema senza riportare il sorgente, che è indispensabile per capire qual è il problema analizzando la logica implementata.
    MARCO BREVEGLIERI
    Software and Web Developer, Teacher and Consultant

    Home | Blog | Delphi Podcast | Twitch | Altro...

  3. #3
    Utente di HTML.it L'avatar di LuckySevenRoX
    Registrato dal
    Sep 2011
    residenza
    Foligno
    Messaggi
    361
    Ecco il sorgente. Ovviamente dato che ci stavo lavorando proprio questa notte potrebbero esserci dei controlli inutili o ripetitivi.. non fateci caso

    Può funzionare? Ho sbagliato qualcosa? Grazie in anticipo

    codice:
    package cavallo;
    
    public class Cavallo {
        public static int[][] scacchiera = new int[8][8];
        public static int[][] movimento = new int [8][2];
        public static boolean FINE = false;
        public static int NCO, NCV; //Le nuove coordinate, ottenute sommando il "movimento" alle coordinate attuali
    
    
        
        public static void main(String[] args) {
            //Azzero la scacchiera
            for (int a = 0; a < 8; a++)
                for (int b = 0; b < 8; b++) {
                    scacchiera[a][b] = 0;
                } 
            
            //Scrivo i movimenti che può fare il cavallo nell'arrat "movimento"
            movimento[0][0] = 2;
            movimento[0][1] = 1;
            
            movimento[1][0] = 1;
            movimento[1][1] = 2;
            
            movimento[2][0] = 2;
            movimento[2][1] = -1;
            
            movimento[3][0] = 1;
            movimento[3][1] = -2;
            
            movimento[4][0] = -2;
            movimento[4][1] = 1;
            
            movimento[5][0] = -1;
            movimento[5][1] = 2;
            
            movimento[6][0] = -2;
            movimento[6][1] = -1;
            
            movimento[7][0] = -1;
            movimento[7][1] = -2;
            
            //Richiamo l'algoritmo, facendo partire il cavallo verso il passo 2
            scacchiera[0][0] = 1;
            Muovi(0, 0, 2);
            
            //Stampo le Coordinate della scacchiera e il numero del passo che contengono per 
            //verificare la riuscita dell'algoritmo
            for (int a = 0; a < 8; a++)
                for (int b = 0; b < 8; b++) {
                    System.out.println("A: " + a + " | B: " + b + " = " + scacchiera[a][b]);
                }
            
        }
        public static void Muovi(int CO, int CV, int Npasso) {
                
                //Ciclo for che richiama le 8 mosse possibili del cavallo
                for (int i = 0; i < 8; i++) {
                    
                    if (FINE == true) { //Controllo che termina i vari cicli for se siamo arrivati alla fine
                        break;
                       
                    } else {
                        //Se il cavallo si trova in un vicolo cieco ed è costretto a tornare al passo precedente,
                        //questa funzione toglie il passo Npasso dalla scacchiera.
                        ControllaPasso(Npasso);
                        
                        //Se la prossima mossa è consentita, si procede con l'algoritmo
                        if (ControllaMossa(CO, CV, i) == 1) {
                            NCO = CO + movimento[i][0];
                            NCV = CV + movimento[i][1];
                            
                            scacchiera[NCO][NCV] = Npasso;  //Scrivo il numero del passo nelle coordinate
                            
                            //Stampa di controllo del processo. Mostra tutti i movimenti del cavallo. Da togliere.
                            System.out.println("CO: " + CO + "| CV: " + CV + " | NCO,NCV: " + NCO + ", "+ NCV + " || Passo: " + Npasso);
                            
                            //Se il cavallo arriva all'ultima casella il ciclo finisce e l'algoritmo è completo.
                            if (Npasso == 64) {
                                FINE = true;
                                break;
                            }
                            Muovi(NCO, NCV, Npasso + 1);
                        }
                    }
                }
        
            
        }
        public static int ControllaMossa(int X, int Y, int indice) {
            X = X + movimento[indice][0];
            Y = Y + movimento[indice][1];
            
            //Se il cavallo non esce dai lati della scacchiera e la casella dove vuole muoversi è vuota, 
            //il movimento può essere fatto (return 1)
            if ((((X < 8) && (X > -1)) && ((Y < 8) && (Y > -1))) && scacchiera[X][Y] == 0)
                    return 1;
            else
                    return 0;
        }
        public static void ControllaPasso(int Npasso){
            //Controlla se il passo attuale è già stato inserito nella scacchiera. In questo caso,
            //il passo inserito viene rimosso e permette al nuovo ciclo di inserire il passo Npasso
            for (int a = 0; a < 8; a++)
                for (int b = 0; b < 8; b++) {
                    if (scacchiera[a][b] == Npasso) {
                        scacchiera[a][b] = 0;
                        a = 8;
                        break;
                    }
                    
                }
        }
    }

  4. #4
    Utente di HTML.it
    Registrato dal
    Aug 2002
    Messaggi
    8,013
    guarda, sono anni oramai che non mi occupo più di calcolo combinatorio, ma appare evidente che il problema sia esponenziale (considera le possibili diramazioni del percorso del cavallo quando si trova in una casella lontana 2 o più caselle dal bordo della scacchiera: potenzialmente 7 percorsi - uno lo eliminiamo perché lo riporterebbe alla casa da cui proveniva).

    E' normale quindi che l'aumento del tempo di esecuzione per passare da 58 a 59 mosse non sia di un 1/58 o di 1/59 rispetto al tempo delle 58 mosse, ma sia una qualche funzione tipo

    T[59] = x * T[58].

    T[64] potrebbe tranquillamente essere nell'ordine di (svariati) anni.

    - Se non altro il problema comunque è risolvibile, con un centinaio -abbondante- di milioni diversi di modi di coprire l'intera scacchiera...c'è solo da capire quanto buono sia questo approccio.

    http://sciencebackstage.blogosfere.i...i-scacchi.html
    <´¯)(¯`¤._)(¯`»ANDREA«´¯)(_.¤´¯)(¯`>
    "The answer to your question is: welcome to tomorrow"

  5. #5
    Utente di HTML.it L'avatar di LuckySevenRoX
    Registrato dal
    Sep 2011
    residenza
    Foligno
    Messaggi
    361
    si infatti il mio algoritmo punta ad analizzare tutte le possibili soluzioni.. devo trovare 1 modo forse + matematico per risolvere la situazione.. grazie del link, approfondirò l'argomento

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2025 vBulletin Solutions, Inc. All rights reserved.