Advertisement
Guest User

Untitled

a guest
Mar 31st, 2019
90
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Java 5 13.83 KB | None | 0 0
  1. import java.util.*;
  2. import java.io.*;
  3.  
  4. class Point{
  5.     public int x;
  6.     public int y;
  7.     public Point(){
  8.         x = 0;
  9.         y = 0;
  10.     }
  11.     public Point (int x, int y){
  12.         this.x = x;
  13.         this.y = y;
  14.     }
  15.     public void print(){
  16.         System.out.println("X = "+x+" Y = "+y);
  17.     }
  18.  
  19.     public double jarakDuaTitik(Point b){
  20.         return (Math.sqrt(((this.x-b.x)*(this.x-b.x))+((this.y-b.y)*(this.y-b.y))));
  21.     }
  22. }
  23.  
  24. class Node{
  25.     public ArrayList<Point> P;
  26.     public double cost;
  27.  
  28.     public Node(){
  29.         this.P = new ArrayList<Point>();
  30.         this.cost = 0;
  31.     }
  32.  
  33.     public void copyNode(Node N){
  34.         for (int i = 0;i<N.P.size();i++){
  35.             P.add(N.P.get(i));
  36.         }
  37.     }
  38. }
  39.  
  40. class labirin{
  41.     public boolean[][] matriks;
  42.     public Point start;
  43.     public int baris;
  44.     public int kolom;
  45.     public int[][] matriksInt;
  46.     public ArrayList<Point> currentList;
  47.     public Node currentNode;
  48.  
  49.     public labirin(int baris, int kolom){
  50.         this.baris = baris;
  51.         this.kolom = kolom;
  52.         matriks = new boolean[baris][kolom];
  53.         matriksInt = new int[baris][kolom];
  54.         start = new Point();
  55.         currentList = new ArrayList<Point>();
  56.         currentNode = new Node();
  57.     }
  58.    
  59.     public void printLabirin(){
  60.         for (int i = 0;i< baris;i++){
  61.             for (int j = 0;j<kolom;j++){
  62.                 if (matriks[i][j] == true){
  63.                     System.out.print("1");
  64.                 }else{
  65.                     System.out.print("0");
  66.                 }
  67.             }
  68.             System.out.println();
  69.         }
  70.     }
  71.  
  72.     public void transferMatriks(){
  73.         int i,j;
  74.         for(i = 0;i<baris;i++){
  75.             for(j = 0;j<kolom;j++){
  76.                 if (matriks[i][j]){
  77.                     matriksInt[i][j] = 1;
  78.                 }else{
  79.                     matriksInt[i][j] = 0;
  80.                 }
  81.             }
  82.         }
  83.     }
  84.  
  85.     public void findStart(){
  86.         boolean found = false;
  87.         int i = 0;
  88.         while ((!found)&&(i<kolom)){
  89.             if (!matriks[0][i]){
  90.                 start.x = i;
  91.                 start.y = 0;
  92.                 found = true;
  93.             }
  94.             if ((!matriks[baris-1][i])&&(!found)){
  95.                 start.x = i;
  96.                 start.y = baris-1;
  97.                 found = true;
  98.             }
  99.             i++;
  100.         }
  101.         i = 0;
  102.         while ((!found)&&(i<baris)){
  103.             if (!matriks[i][0]){
  104.                 start.x = 0;
  105.                 start.y = i;
  106.                 found = true;
  107.             }
  108.             if ((!matriks[i][kolom-1])&&(!found)){
  109.                 start.x = kolom-1;
  110.                 start.y = i;
  111.                 found = true;
  112.             }
  113.             i++;
  114.         }
  115.     }
  116.  
  117.     public void copyList(ArrayList<Point> dari, ArrayList<Point> ke){
  118.         for (int i = 0;i<dari.size();i++){
  119.             ke.add(dari.get(i));
  120.         }
  121.     }
  122.  
  123.     public void solveBFS(){ //Menyelesaikan dengan algoritma BFS
  124.         currentList.clear();
  125.         ArrayList<ArrayList<Point>> queue = new ArrayList<ArrayList<Point>>();
  126.         Point currentPoint = new Point(start.x, start.y);
  127.         boolean[][] matriksSudahDikunjungi = new boolean[baris][kolom];
  128.         matriksSudahDikunjungi[start.y][start.x] = true;
  129.         currentList.add(currentPoint);
  130.         if (currentPoint.x == 0){
  131.             currentList.add(new Point(currentPoint.x+1,currentPoint.y));
  132.         }
  133.         if (currentPoint.x == kolom-1){
  134.             currentList.add(new Point(currentPoint.x-1,currentPoint.y));
  135.         }
  136.         if (currentPoint.y == 0){
  137.             currentList.add(new Point(currentPoint.x,currentPoint.y+1));
  138.         }
  139.         if (currentPoint.y == baris-1){
  140.             currentList.add(new Point(currentPoint.x,currentPoint.y-1));
  141.         }
  142.         currentPoint = currentList.get(currentList.size()-1);
  143.         while ((currentPoint.x!=0)&&(currentPoint.x!=kolom-1)&&(currentPoint.y!=0)&&(currentPoint.y!=baris-1)){
  144.             matriksSudahDikunjungi[currentPoint.y][currentPoint.x] = true;
  145.             if (!matriks[currentPoint.y][currentPoint.x+1]){
  146.                 if(!matriksSudahDikunjungi[currentPoint.y][currentPoint.x+1]){
  147.                     ArrayList<Point> prevList = new ArrayList<Point>();
  148.                     copyList(currentList,prevList);
  149.                     prevList.add(new Point(currentPoint.x+1,currentPoint.y));
  150.                     queue.add(prevList);
  151.                 }
  152.             }
  153.             if (!matriks[currentPoint.y][currentPoint.x-1]){
  154.                 if(!matriksSudahDikunjungi[currentPoint.y][currentPoint.x-1]){
  155.                     ArrayList<Point> prevList = new ArrayList<Point>();
  156.                     copyList(currentList,prevList);
  157.                     prevList.add(new Point(currentPoint.x-1,currentPoint.y));
  158.                     queue.add(prevList);
  159.                 }
  160.             }
  161.             if (!matriks[currentPoint.y+1][currentPoint.x]){
  162.                 if(!matriksSudahDikunjungi[currentPoint.y+1][currentPoint.x]){
  163.                     ArrayList<Point> prevList = new ArrayList<Point>();
  164.                     copyList(currentList,prevList);
  165.                     prevList.add(new Point(currentPoint.x,currentPoint.y+1));
  166.                     queue.add(prevList);
  167.                 }
  168.             }
  169.             if (!matriks[currentPoint.y-1][currentPoint.x]){
  170.                 if(!matriksSudahDikunjungi[currentPoint.y-1][currentPoint.x]){
  171.                     ArrayList<Point> prevList = new ArrayList<Point>();
  172.                     copyList(currentList,prevList);
  173.                     prevList.add(new Point(currentPoint.x,currentPoint.y-1));
  174.                     queue.add(prevList);
  175.                 }
  176.             }    
  177.             currentList = queue.get(0);
  178.             currentPoint = currentList.get(currentList.size()-1);
  179.             queue.remove(0);
  180.         }
  181.     }
  182.    
  183.     public Point findFinish(){
  184.         Point pointTemp = new Point();
  185.         boolean found = false;
  186.         int i = 0;
  187.         while ((!found)&&(i<kolom)){
  188.             if (!matriks[0][i]&&((i!=start.x)||(start.y!=0))){
  189.                 pointTemp.x = i;
  190.                 pointTemp.y = 0;
  191.                 found = true;
  192.             }
  193.             if ((!matriks[baris-1][i])&&(!found)&&((i!=start.x)||(start.y!=baris-1))){
  194.                 pointTemp.x = i;
  195.                 pointTemp.y = baris-1;
  196.                 found = true;
  197.             }
  198.             i++;
  199.         }
  200.         i = 0;
  201.         while ((!found)&&(i<baris)){
  202.             if ((!matriks[i][0])&&((0!=start.x)||(start.y!=i))){
  203.                 pointTemp.x = 0;
  204.                 pointTemp.y = i;
  205.                 found = true;
  206.             }
  207.             if ((!matriks[i][kolom-1])&&(!found)&&((kolom-1!=start.x)||(start.y!=i))){
  208.                 pointTemp.x = kolom-1;
  209.                 pointTemp.y = i;
  210.                 found = true;
  211.             }
  212.             i++;
  213.         }
  214.         return pointTemp;
  215.     }
  216.  
  217.     public void solveAStar(){   //Menyelesaikan dengan algoritma A*
  218.         int fh = 0,idxMin;
  219.         currentNode.P.clear();
  220.         boolean[][] matriksSudahDikunjungi = new boolean[baris][kolom];
  221.         Point finishPoint = new Point();
  222.         finishPoint = findFinish();
  223.         ArrayList<Node> arrayNode = new ArrayList<Node>();
  224.         currentNode.P.add(new Point(start.x,start.y));
  225.         currentNode.cost = fh + currentNode.P.get(currentNode.P.size()-1).jarakDuaTitik(finishPoint);// Ini adalah fungsi cost-nya
  226.         matriksSudahDikunjungi[currentNode.P.get(currentNode.P.size()-1).y][currentNode.P.get(currentNode.P.size()-1).x] = true;
  227.        
  228.         if (currentNode.P.get(currentNode.P.size()-1).x == 0){
  229.             currentNode.P.add(new Point(currentNode.P.get(currentNode.P.size()-1).x+1,currentNode.P.get(currentNode.P.size()-1).y));
  230.         }
  231.         if (currentNode.P.get(currentNode.P.size()-1).x == kolom-1){
  232.             currentNode.P.add(new Point(currentNode.P.get(currentNode.P.size()-1).x-1,currentNode.P.get(currentNode.P.size()-1).y));
  233.         }
  234.         if (currentNode.P.get(currentNode.P.size()-1).y == 0){
  235.             currentNode.P.add(new Point(currentNode.P.get(currentNode.P.size()-1).x,currentNode.P.get(currentNode.P.size()-1).y+1));
  236.         }
  237.         if (currentNode.P.get(currentNode.P.size()-1).y == baris-1){
  238.             currentNode.P.add(new Point(currentNode.P.get(currentNode.P.size()-1).x,currentNode.P.get(currentNode.P.size()-1).y-1));
  239.         }
  240.  
  241.        
  242.         while ((currentNode.P.get(currentNode.P.size()-1).x!=finishPoint.x)||(currentNode.P.get(currentNode.P.size()-1).y!=finishPoint.y)){
  243.             fh++;
  244.             matriksSudahDikunjungi[currentNode.P.get(currentNode.P.size()-1).y][currentNode.P.get(currentNode.P.size()-1).x] = true;
  245.             if (!matriks[currentNode.P.get(currentNode.P.size()-1).y][currentNode.P.get(currentNode.P.size()-1).x+1]){
  246.                 if(!matriksSudahDikunjungi[currentNode.P.get(currentNode.P.size()-1).y][currentNode.P.get(currentNode.P.size()-1).x+1]){
  247.                     Node nextNode = new Node();
  248.                     nextNode.copyNode(currentNode);
  249.                     nextNode.P.add(new Point(currentNode.P.get(currentNode.P.size()-1).x+1,currentNode.P.get(currentNode.P.size()-1).y));
  250.                     nextNode.cost = fh + nextNode.P.get(currentNode.P.size()-1).jarakDuaTitik(finishPoint);
  251.                     arrayNode.add(nextNode);
  252.                    
  253.                 }
  254.             }
  255.             if (!matriks[currentNode.P.get(currentNode.P.size()-1).y][currentNode.P.get(currentNode.P.size()-1).x-1]){
  256.                 if(!matriksSudahDikunjungi[currentNode.P.get(currentNode.P.size()-1).y][currentNode.P.get(currentNode.P.size()-1).x-1]){
  257.                     Node nextNode = new Node();
  258.                     nextNode.copyNode(currentNode);
  259.                     nextNode.P.add(new Point(currentNode.P.get(currentNode.P.size()-1).x-1,currentNode.P.get(currentNode.P.size()-1).y));
  260.                     nextNode.cost = fh + nextNode.P.get(currentNode.P.size()-1).jarakDuaTitik(finishPoint);
  261.                     arrayNode.add(nextNode);
  262.                    
  263.                 }
  264.             }
  265.             if (!matriks[currentNode.P.get(currentNode.P.size()-1).y+1][currentNode.P.get(currentNode.P.size()-1).x]){
  266.                 if(!matriksSudahDikunjungi[currentNode.P.get(currentNode.P.size()-1).y+1][currentNode.P.get(currentNode.P.size()-1).x]){
  267.                     Node nextNode = new Node();
  268.                     nextNode.copyNode(currentNode);
  269.                     nextNode.P.add(new Point(currentNode.P.get(currentNode.P.size()-1).x,currentNode.P.get(currentNode.P.size()-1).y+1));
  270.                     nextNode.cost = fh + nextNode.P.get(currentNode.P.size()-1).jarakDuaTitik(finishPoint);
  271.                     arrayNode.add(nextNode);
  272.                 }
  273.             }
  274.             if (!matriks[currentNode.P.get(currentNode.P.size()-1).y-1][currentNode.P.get(currentNode.P.size()-1).x]){
  275.                 if(!matriksSudahDikunjungi[currentNode.P.get(currentNode.P.size()-1).y-1][currentNode.P.get(currentNode.P.size()-1).x]){
  276.                     Node nextNode = new Node();
  277.                     nextNode.copyNode(currentNode);
  278.                     nextNode.P.add(new Point(currentNode.P.get(currentNode.P.size()-1).x,currentNode.P.get(currentNode.P.size()-1).y-1));
  279.                     nextNode.cost = fh + nextNode.P.get(currentNode.P.size()-1).jarakDuaTitik(finishPoint);
  280.                     arrayNode.add(nextNode);
  281.                 }
  282.             }
  283.             idxMin = 0;
  284.             for (int i = 1;i<arrayNode.size();i++){
  285.                 if (arrayNode.get(i).cost<arrayNode.get(idxMin).cost){
  286.                     idxMin = i;
  287.                 }
  288.             }
  289.             currentNode = arrayNode.get(idxMin);
  290.             arrayNode.remove(idxMin);
  291.         }
  292.  
  293.         currentNode.P.get(currentNode.P.size()-1).print(); //currentNode yg skr ini titik akhirnya
  294.     }
  295.  
  296.     public static void main(String args[]){
  297.         BufferedReader br = null,br2 = null;
  298.         FileReader fr = null,fr2 = null;
  299.         String namaFile;
  300.         Scanner scan = new Scanner(System.in);
  301.         System.out.print("Input nama file : ");
  302.         namaFile = scan.nextLine();
  303.         scan.close();
  304.         try{
  305.             fr = new FileReader(namaFile);
  306.             br = new BufferedReader(fr);
  307.            
  308.             int x,y,i;
  309.             String sCurrentLine = br.readLine();
  310.             x = sCurrentLine.length();
  311.             y = 0;
  312.             while(sCurrentLine!=null){
  313.                 y++;
  314.                 sCurrentLine = br.readLine();
  315.             }
  316.             System.out.println("Jumlah Baris : "+y);
  317.             System.out.println("Jumlah Kolom : "+x);
  318.             System.out.println();
  319.  
  320.             labirin objLabirin = new labirin(y,x);
  321.  
  322.             fr2 = new FileReader(namaFile);
  323.             br2 = new BufferedReader(fr2);
  324.             y = 0;
  325.             sCurrentLine = br2.readLine();
  326.             while(sCurrentLine!=null){
  327.                 i = 0;
  328.                 while(i<x){
  329.                     if (sCurrentLine.charAt(i)=='0'){
  330.                         objLabirin.matriks[y][i] = false;
  331.                     }else{
  332.                         objLabirin.matriks[y][i] = true;
  333.                     }
  334.                     i++;
  335.                 }
  336.                 y++;
  337.                 sCurrentLine = br2.readLine();
  338.             }
  339.             objLabirin.transferMatriks();
  340.             objLabirin.printLabirin();
  341.             objLabirin.findStart();
  342.             System.out.println();
  343.             System.out.println();
  344.         }
  345.         catch (IOException e) {
  346.             e.printStackTrace();
  347.             System.out.println("Ada kesalahan pada file eksternal.");
  348.         }
  349.         finally {
  350.             try {
  351.                 if (br != null)
  352.                     br.close();
  353.                 if (fr != null)
  354.                     fr.close();
  355.             } catch (IOException ex) {
  356.                 ex.printStackTrace();
  357.             }
  358.         }
  359.     }
  360. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement