Skip to main content

Source code knight tour pada java

Barang kali ada yang butuh source code knight tour pada java. Kebetulan juga Minggu yang lalu ada yang butuh, sekalian mimin post ni source code nya.





import java.applet.Applet;
import java.awt.*;
class Square {
            int id;
        Board b = null;
        boolean visited = false;
        Square(int n) { id = n;}
        Square(int n,Board b){ id =n; this.b = b;}
        int row(){ return id/8+ 1;}
        int col(){ return (id%8) + 1;}
        int getId(int r, int c) { return (r-1)*8+c-1;}
        // returns  legal moves from this square
        int[] next(){
             int p[] = new int[8];
             int m = 0,r,c;
             for(int i=0; i < 8;i++){
                 r = this.row(); c = this.col();
                switch(i){
                 case 0:  r -= 2; c += 1; break;
                 case 1:  r -= 1; c += 2; break;
                 case 2:  r += 1; c += 2; break;
                 case 3:   r += 2; c += 1 ; break;
                 case 4:  r += 2 ; c -= 1; break;
                 case 5:  r += 1; c -= 2; break;
                 case 6:  r -= 1; c -= 2; break;
                 case 7:  r -= 2; c -= 1; break;
                }            
                 if(( r < 1) || ( r > 8) || ( c < 1) || (c > 8)) continue;
                p[m] = getId(r,c);
                m++;
             }
             int t[]= new int[m];
             System.arraycopy(p,0,t,0,m);
             return t;   
        }
        // returns the number of moves from the next jump.
        // takes into account of visited squares
        int escapes(int omit){
            int nxt[];
            nxt = next();
            int e=0;
            for(int i = 0; i < nxt.length; i++){
                if(b.sq[nxt[i]].visited || (nxt[i]== omit)) continue;
                e++;
            }
            return e;   
        }
        // this is the HEURISTICS
        // what is the best jump from the square ?
        // -1 if none. Note that you may get trapped into a hole and can not
        // come out since all possible escape squares are already visited
        int goodExit(){
            int nxt[];
            nxt = next();
            int k = 8;
            int idx = -1;
            int e = 0;
            for(int i = 0; i < nxt.length; i++) {
                if(b.sq[nxt[i]].visited) continue;
                e = b.sq[nxt[i]].escapes(nxt[i]);
                if((e > 0) && ( e < k)) { k = e; idx = i;}
            }
            if(idx == -1) return idx;
            else
            return nxt[idx];
        }    
   
}
class Board extends Thread {
   
        Square sq[];
        CSquare csq[];
        boolean running = false;  // set true while the knight is moving
        int delayInterval = 500;
        int stsq = 0;
        Board(){
            sq = new Square[64];
            for(int i = 0; i < 64; i++) sq[i] = new Square(i,this);
        }
        // Returns the path. The problem was first solved without 'visual'
        // encumberences. At that this method allowed me 'print' the
        // path on stdout and check the logic
        int[]findPath(int startSquare){
            int i  = 0;
            int path[];
            path = new int[64];
            for(i = 0; i < 64; i++) sq[i].visited = false;
            sq[startSquare-1].visited = true;
            int nxt[];
            int n = -1;
            int moves = 0;
            int currentSquare = startSquare-1;
            path[currentSquare] = moves+1;
            for( i = 0; i < 64; i++) {
                n = sq[currentSquare].goodExit();
                if( n < 0 ) break;
                sq[n].visited = true;
                moves++;
                currentSquare = n;
                // remember path path
                path[currentSquare] = moves+1;
            }
            // find out unvisited squares
            int nUnvisited = 0;
            int unvisited = -1;
            for(i = 0; i < 64; i++){
                if(!sq[i].visited){
                    unvisited = i;
                    nUnvisited++;
                }
            }
            if(nUnvisited == 1) {
                nxt = sq[currentSquare].next();
                for(i = 0;i < nxt.length; i++) {
                    if(nxt[i] == unvisited) {
                        path[unvisited]=moves+2;
                        break;
                    }   
                }
            } else {
                // System.out.println("Failed to find solution");
                 // System.exit(1);
                return null;
            }
            return path;   
        }
        // Engine
        public void run(){
            running = true;
           showPath(stsq);
            running = false;
            stop();                           
        }
        // Visually show the knignts moves on the chess board
        // Sleep a little after each so that user is not suspicious.
        void showPath(int startSquare){
            int i  = 0;
            int path[];
            path = new int[64];
            for(i = 0; i < 64; i++){
                 sq[i].visited = false;
                 csq[i].num = -1;
                 csq[i].hval = -1;
                 csq[i].update(csq[i].getGraphics());
            }   
            sq[startSquare-1].visited = true;
            int nxt[];
            int n = -1;
            int moves = 0;
            int currentSquare = startSquare-1;
            path[currentSquare] = moves+1;
            csq[currentSquare].num = moves+1;
            csq[currentSquare].hval = 1;
         csq[currentSquare].update(csq[currentSquare].getGraphics());
            for( i = 0; i < 64; i++) {
                try {
                    sleep(delayInterval);
                } catch(InterruptedException e){
                }
                n = sq[currentSquare].goodExit();
                if( n < 0 ) break;
                sq[n].visited = true;
                csq[currentSquare].hval = -1;
            csq[currentSquare].update(csq[currentSquare].getGraphics());               
                moves++;
                currentSquare = n;
                // remember path
                path[currentSquare] = moves+1;
                csq[currentSquare].num = moves+1;
                csq[currentSquare].hval = 1;
            csq[currentSquare].update(csq[currentSquare].getGraphics());
            }
            // Find out unvisited squares
            // Since the goodExit always looks one ahead, if every thing
            // is OK when we arrive here theres should be exactly one
            // unvisited square and it should be reachale from the last visted
            // square
            int nUnvisited = 0;
            int unvisited = -1;
            for(i = 0; i < 64; i++){
                if(!sq[i].visited){
                    unvisited = i;
                    nUnvisited++;
                }
            }
            if(nUnvisited == 1) {
                nxt = sq[currentSquare].next();
                for(i = 0;i < nxt.length; i++) {
                    if(nxt[i] == unvisited) {
                        csq[currentSquare].hval = -1;
                  csq[currentSquare].update(csq[currentSquare].getGraphics());                       
                        path[unvisited]=moves+2;
                        csq[unvisited].num = moves+2;
                        csq[unvisited].repaint();
                        break;
                    }
                }
            } else {
                // System.out.println("Failed to find solution");
                 // System.exit(1);
                return;
            }
            return ;   
        }
       
   
}

public class Knighttour extends Applet {
        boolean inApplet = false;
        int width = 280;
        int height = 180;
        public static void main(String argv[]){
        int i  = 0;
        int N = 250;
        if(argv.length > 0) {
            try {
                N = Integer.parseInt(argv[0]);
            } catch (NumberFormatException e) {
                System.out.println(e.getMessage());
                System.exit(1);       
            }
        }   
        int path[];
        Board board = null;
        MyFrame fr= new MyFrame();
        fr.setLayout(new GridLayout(8,8));
        fr.board = board;
        CSquare sqr[] = new CSquare[64];
        for(i = 0; i < 64; i++) {
             sqr[i] = new CSquare();
             sqr[i].id = i;
             fr.add(sqr[i]);
        }
        fr.csq = sqr;
        fr.validate();
        fr.resize(200,200);       
        fr.show();
    }
    MyFrame frame;Board board;
    Button fast,slow,show,hide;   
    public void  init(){
        inApplet = true;
        int i  = 0;
        int N = 0;
        setLayout(new BorderLayout());
        fast = new Button("Faster");
        slow = new Button("Slower");
        show = new Button("Show");
        hide = new Button("Hide");
        hide.disable();
        Panel p = new Panel();
        p.add(fast); p.add(slow);p.add(show); p.add(hide);
        add("South",p);
        frame = new MyFrame();
        frame.setLayout(new GridLayout(8,8));
        frame.board = board;
        frame.inApplet = true;
        frame.show = show;
        frame.hide = hide;
        CSquare sqr[] = new CSquare[64];
        frame.csq = sqr;
        for(i = 0; i < 64; i++) {
             sqr[i] = new CSquare();
             sqr[i].id = i;
             frame.add(sqr[i]);
        }
        width = size().width; height = size().height;
        resize(width,height);
        frame.resize(200,200);       
        board = null;
    }
    public Dimension minimumSize(){
        return new Dimension(width,height);
    }
    public Dimension preferredSize(){
        return minimumSize();
    }
    public void paint(Graphics g){
        g.drawRect(0,0,size().width-1,140);
        String s = "Knight's Tour";
        g.setFont(new Font("Serif",Font.ITALIC,24));
        FontMetrics fm = g.getFontMetrics();
        int len = fm.stringWidth(s);
        g.drawString(s,(size().width-len)/2,50);
        g.setFont(new Font("Arial",Font.BOLD,12));
        fm = g.getFontMetrics();
        s = "Click on Show button to see Chess Board";
        len = fm.stringWidth(s);
        g.drawString(s,(size().width-len)/2,75);
        s = "Click on any square to start tour from that square";
        len = fm.stringWidth(s);
        g.drawString(s,(size().width-len)/2,100);
        s = "After the start, click on any square to stop";
        len = fm.stringWidth(s);
        g.drawString(s,(size().width-len)/2,125);
    }
    int interval = 250;
    public boolean handleEvent(Event e) {
        Object target = e.target;   
            if(e.id == Event.ACTION_EVENT){
                if(e.target == show){
                    frame.show();
                    show.disable();
                    hide.enable();
                    return true;
                }
                if(e.target == hide){
               
                    frame.hide();
                    hide.disable();
                    show.enable();
                    return true;
               
                }
                if(e.target == fast){
                  if(board != null) {
                        board.delayInterval -= 50;
                        if(board.delayInterval < 50) board.delayInterval = 50;
                    }else {
                        frame.interval -= 50;
                        if(frame.interval < 50) frame.interval = 50;
                    }                   
                    return true;
                }
                if(e.target == slow){
                    if(board != null) {
                        board.delayInterval += 50;
                        if(board.delayInterval >2000) board.delayInterval = 2000;
                    } else {
                        frame.interval += 50;
                        if(frame.interval > 2000) frame.interval = 2000;
                    }
                   
                    return true;
                }

            }
        return super.handleEvent(e);   
    }
    public void stop(){
        frame.hide();
        show.enable();
        hide.disable();
    }       
}
class MyFrame extends Frame  {
    Board board;
    CSquare csq[];
    boolean inApplet = false;
    int interval = 250;
    Button show,hide;
    public MyFrame(){
        super("Knight's Tour");
    }
// Deprecated in Java 1.1 onwards. Use event listners instead   
    public boolean handleEvent(Event event) {
        if((event.id >= 5000)&&(event.id < 5064)){
           if((board != null)&& board.running)  {
               csq = board.csq;
                board.stop();
                board = null;
                return true;
            }
            if((board != null) && !board.running) board = null;
            if(board == null) {
                board = new Board();
                board.csq = csq;               
                board.stsq = event.id-5000+1;
                board.delayInterval = interval;
                board.start();
            }   
                       
        }
      if(!inApplet && (event.id == Event.WINDOW_DESTROY)) {
            dispose();
            System.exit(0); // necessary we should go to DOS prompt
         return super.handleEvent(event);
      }
        if(inApplet && (event.id == Event.WINDOW_DESTROY)) {
            hide();
            show.enable();
            hide.disable();
         return true ;
      } 
       
      return super.handleEvent(event);
    }
}
class CSquare extends Canvas{
    int h,w;
    int id;
    int num = -1;
    int hval = -1;
    CSquare(int w, int h){
        this.w = w; this.h = h;
    }
    CSquare(){
        h = 18;
        w = 18;
    }
    synchronized public void paint(Graphics g){
        w = size().width;h = size().height;
        int r =  id/8;
        int c = (id%8);
        if(hval == -1){
            if( ((r+c)%2) == 0) g.setColor(Color.lightGray);
            else
            g.setColor(Color.gray /* new Color(192,192,192)*/);
        }   
        else g.setColor(Color.red);
        g.fillRect(0,0,w,h);
        g.setColor(Color.black);
        g.drawRect(1,1,w-1,h-1);
       
        String s ;
        if(num != -1){
            s = num+"";
            int len = g.getFontMetrics().stringWidth(s);
            int ht = g.getFontMetrics().getHeight();
            if( ((r+c)%2) == 0) g.setColor(Color.black);
            else
            g.setColor(Color.white);
            g.drawString(s,(w-len)/2,(h+ht)/2);
        }   
    }
    public void update(Graphics g){
   
        paint(g);
    }
    // Deprecated in Java 1.1 onwards. Use new Event model
   synchronized public boolean handleEvent(Event e) {
        Object target = e.target;
        if(e.id == Event.MOUSE_UP){
//          System.out.println("up");
          getParent().deliverEvent(new Event(getParent(),5000+id,null));
          return true;   
        }
      return super.handleEvent(e);
    }
// Deprecated in Java 1.1 onwards. Use get functions
     public Dimension minimumSize() {
        return new Dimension(w,h);
  }
    public Dimension preferredSize() {
           return minimumSize();
  }
       
}

Comments

Popular posts from this blog

PREDIKS FINAL LIGA CHAMPIONS 2016

  Final Liga Champions 2016 akan mempertemukan dua tim sekota Real Madrid dan Atletico Madrid. Untuk kali ini Final akan digelar Minggu 28 Mei 2016 mendatang di San Siro Milan, Italia. Kita tahu kedua tim ini sudah pernah bentrok di final Liga Champions 2014 lalu. Saat itu Real Madrid berhasil keluar sebagai juara dengan skror 4-1. Namun dalam laga final nanti, Atletico Madrid justru lebih difavoritkan juara ketimbang Real Madrid. Kenapa bisa ya??? Pasalnya skuad Atletico telah membuktikan bahwa mereka mampu menaklukan raksasa-raksasa Eropa seperti Barcelona dan Bayern Munchen. Keduanya pun kalah karena gol tandang oleh Atletico. Di ajang liga domestik, skuad Diego Simeone juga lebih unggul dibandingkan Real Madrid dalam beberapa pertemua terakhir, menahan imbang 1-1 di pekan ke 7 Liga Spanyol dan menang 1-0 di kandang Real Madrid pada pekan 26. Atletico Madrid lebih berbahaya lagi kali ini, pasalnya mereka kini sudah tersingkir dari perburuan gelar juara liga Spanyol...

Membuat Program Perhitungan Nilai Di linux Ubuntu

Assalamualaikum teman-teman senang bisa menulis lagi di blog kesayangan ane ini, nah kali ini ane mau share program di terminal linux kebetulan saya memakai linux ubuntu  dengan membuat program perhitungan nilai, cocok banget untuk megetahui nilai kita selama belajar sehingga kita bisa mengetahui nilai yang kita hasilkan selama ini. Baik langkah pertama adalah buka terminal linux anda dengan menekan ctrl+alt+t di keyboard.     1. setelah terbuka ketikkan “ pico” (di sini saya mencontohkan pico kuis ) kuis untuk nama file nya kebetulan saya membuat program ini untuk kebutuhan tugas saya, jadi anda bisa mengganti dengan sesuka hati anda.        2. Selanjutnya ketika shell dari linux terbuka ketikkan koding seperti di bawah ini        3.   Setelah selesai mengetikkan koding seperti di atas langkah selanjutnya adalah untuk menyimpan file nya dengan cara tekan ctrl+x di keyboard lalu tekan tombol y ...

mari lihat keindahan pulau banyak di aceh singkil

  Pulau Banyak Adalah Gugusan Pulau-pulau kecil di Kabupaten Aceh Singkil provinsi Aceh. luas wilayah secara keseluruhan adalah 27,196 Ha. Pulau Banyak yang terdiri dari gugusan pulau- pulau berbatasan langsung dengan Samudra Hindia, tepatnya di ujung sebelah barat Pulau Sumatera.ada 99 buah pulau di gugus Kepulauan Banyak yang sangat layak dikembangkan menjadi objek wisata andalan. Termasuk keindahan alam bawah laut dan penyu hijaunya.