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...

Akhirnya PSSI memilih Luis Milla untuk Menukangi Timnas Indonesia

Setelah menunggu beberapa bulan, Luis Milla akhirnya diresmikan sebagai pelatih Timnas Indonesia. Keputusan itu diumumkan PSSI pada konferensi pers di Grand Rubina, Jakarta, Jumat (20/1/2017). Nama Luis Milla sendiri sudah muncul sejak Kongres Tahunan PSSI di Bandung beberapa waktu lalu. Kala itu, ia disebut sebagai salah satu kandidat pelatih selain Luis Fernandez. Seiring berjalanannya waktu, PSSI mengindikasikan bahwa calon pelatih Timnas Indonesia mengerucut pada satu nama. Sejak itu, nama Milla muncul sebagai calon tunggal. "Sangat bahagia dengan penerimaan sejak datang ke Jakarta. Sangat penting bagi saya untuk menerima pekerjaan ini, ini adalah sebuah tanggung jawab yang sangat penting," kata Milla dalam konferensi pers, Jumat (20/1/2017) di Grand Rubina, Jakarta. Nama Luis Milla sendiri dikenal sebagai pelatih yang paham memaksimalkan kekuatan pemain muda. Sebagian besar kariernya dilewati dalam lingkup yang dekat pemain muda. sumber:http://bola.li...

Pengusaha Online yang Berhasil Sukses Di Bawah Umur 30 Tahun

Baiklah gan kita akan membahas pemuda Pengusaha Online yang Berhasil Sukses Di Bawah Umur 30 Tahun… anda tentunya ingin tahu siapa saja mereka, ini dia para pemuda-pemuda yang berhasil sukses tersebut. cekidot... 1. Mark Zuckerberg (25 tahun) Website: http://www.facebook.com Mark Zuckerberg, Billioner termuda di dunia dan pemilik situs social networking terbesar di dunia… Facebook. Facebook sekarang menjelma menjadi situs nomor dua yang paling sering dikunjungi didunia setelah Google. 2. Matt Mullenweg (25 tahun) Website: http://wordpress.com Mattew Mullenweg penemu software Blog Engine WordPress. 3. Matt Mickiewicz (25 tahun) Website: http://www.sitepoint.com http://www.99designs.comdan http://www.flippa.com Mickiewicz adalah inspirasi bagi webmaster diseluruh dunia. Website dia sitepoint.com telah membantu webmaster untuk belajar tentang web, cara menjual, membeli buku ataupun belajar coding dan membuat background twitter....