Advertisement
fensa08

[APS] Izminuvanje na Lavirint

Sep 18th, 2019
1,602
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Java 8.16 KB | None | 0 0
  1. Изминување на лавиринт Problem 2 (1 / 1)
  2.  
  3. Нека е даден совршен лавиринт (во форма како на аудиториските вежби - како влез од карактери). Ваша задача е да изгенерирате граф со листа на соседство (ненасочен и нетежински) од дадениот влез и да ја испечатите патеката од почетното (темето означено со S) до крајното теме (темето означено со Е).
  4.  
  5. Патеката ја печатите на следниот начин: ги печатите координатите на јазлите кои ги изминувате (т.е ги печатите позициите од влезот)
  6.  
  7. Име на класа: Lavirint
  8.  
  9.  
  10.  
  11.  
  12. ====================================================================================================================================
  13.  
  14. import java.io.BufferedReader;
  15. import java.io.IOException;
  16. import java.io.InputStreamReader;
  17. import java.util.Hashtable;
  18. import java.util.Stack;
  19.  
  20. class Lavirint {
  21.  
  22.  
  23.  
  24.     static class Graph {
  25.  
  26.         int num_nodes; // broj na jazli
  27.         int adjMat[][];  // matrica na sosednost
  28.  
  29.         public Graph(int num_nodes) {
  30.             this.num_nodes = num_nodes;
  31.             adjMat = new int[num_nodes][num_nodes];
  32.  
  33.             for(int i=0;i<this.num_nodes;i++)
  34.                 for(int j=0;j<this.num_nodes;j++)
  35.                     adjMat[i][j]=0;
  36.         }
  37.  
  38.         public Graph(int num_nodes, int[][] adjMat) {
  39.             this.num_nodes = num_nodes;
  40.             this.adjMat = adjMat;
  41.         }
  42.  
  43.  
  44.         int adjacent(int x,int y)
  45.         {  // proveruva dali ima vrska od jazelot so indeks x do jazelot so indeks y
  46.             return (adjMat[x][y]!=0)?1:0;
  47.         }
  48.  
  49.         void addEdge(int x,int y)
  50.         {  // dodava vrska megu jazlite so indeksi x i y
  51.             adjMat[x][y]=1;
  52.             adjMat[y][x]=1;
  53.         }
  54.  
  55.         void deleteEdge(int x,int y)
  56.         {
  57.             // ja brise vrskata megu jazlite so indeksi x i y
  58.             adjMat[x][y]=0;
  59.             adjMat[y][x]=0;
  60.         }
  61.  
  62.         public int getNum_nodes() {
  63.             return num_nodes;
  64.         }
  65.  
  66.         public void setNum_nodes(int num_nodes) {
  67.             this.num_nodes = num_nodes;
  68.         }
  69.  
  70.  
  71.  
  72.         @Override
  73.         public String toString() {
  74.             String ret="  ";
  75.             for(int i=0;i<num_nodes;i++)
  76.                 ret+=i+" ";
  77.             ret+="\n";
  78.             for(int i=0;i<num_nodes;i++){
  79.                 ret+=i+" ";
  80.                 for(int j=0;j<num_nodes;j++)
  81.                     ret+=adjMat[i][j]+" ";
  82.                 ret+="\n";
  83.             }
  84.             return ret;
  85.         }
  86.  
  87.  
  88.     }
  89.  
  90.  
  91.  
  92.     static class Maze {
  93.  
  94.         //Kje se koristi nenasocen graf implementiran so martica na sosednost
  95.         //za pretstavuvanje na lavirintot
  96.         //Teminjata vo grafot se samo indeksi
  97.         //Iminjata na teminjata se preveduvaat vo broevi preku hash tabela
  98.         //T.e. na pr. 1,1 kje se prevede vo 1 (1,1 kje se zacuva kako string)
  99.  
  100.         Graph g;
  101.         int start_node; //indeks temeto koe e vlez
  102.         int end_node; //indeks na temeto koe e izlez
  103.  
  104.         Hashtable<String,Integer> h;
  105.  
  106.  
  107.         Hashtable<Integer,String> rehash;
  108.  
  109.  
  110.         public Maze() {
  111.             h = new Hashtable<String,Integer>();
  112.             rehash = new Hashtable<Integer,String>();
  113.         }
  114.  
  115.         void generateGraph(int rows, int columns, String[] in){
  116.  
  117.             int num_nodes = 0;
  118.  
  119.             String key;
  120.  
  121.             for(int i=1; i<rows; i++){
  122.                 for(int j=1; j<columns; j++){
  123.                     if(in[i].charAt(j)!='#'){
  124.                         key = i+","+j;
  125.                         rehash.put(num_nodes+1,key);
  126.                         h.put(key, num_nodes);
  127.                         if(in[i].charAt(j)=='S')
  128.                             start_node = num_nodes;
  129.                         if(in[i].charAt(j)=='E')
  130.                             end_node = num_nodes;
  131.                         num_nodes++;
  132.                     }
  133.                 }
  134.             }
  135.  
  136.             g = new Graph(num_nodes);
  137.  
  138.             int x;
  139.             int y;
  140.             //generiranje na matrica na sosednost
  141.             for(int i=1; i<rows; i++){
  142.                 for(int j=1; j<columns; j++){
  143.                     if(in[i].charAt(j)!='#'){
  144.                         //dali ima teme pred nego
  145.                         if(in[i].charAt(j-1)!='#'){
  146.                             x = h.get(i+","+j);
  147.                             y = h.get(i+","+(j-1));
  148.                             g.addEdge(x, y);
  149.                         }
  150.                         //dali ima teme posle nego
  151.                         if(in[i].charAt(j+1)!='#'){
  152.                             x = h.get(i+","+j);
  153.                             y = h.get(i+","+(j+1));
  154.                             g.addEdge(x, y);
  155.                         }
  156.                         //dali ima teme nad nego
  157.                         if(in[i-1].charAt(j)!='#'){
  158.                             x = h.get(i+","+j);
  159.                             y = h.get((i-1)+","+j);
  160.                             g.addEdge(x, y);
  161.                         }
  162.                         //dali ima teme pod nego
  163.                         if(in[i+1].charAt(j)!='#'){
  164.                             x = h.get(i+","+j);
  165.                             y = h.get((i+1)+","+j);
  166.                             g.addEdge(x, y);
  167.                         }
  168.                     }
  169.                 }
  170.             }
  171.         }
  172.  
  173.         void findPath(){
  174.             boolean visited[] = new boolean[g.getNum_nodes()];
  175.             for (int i = 0; i < g.getNum_nodes(); i++)
  176.                 visited[i] = false;
  177.             visited[start_node] = true;
  178.             Stack<Integer> s = new Stack<Integer>();
  179.             s.push(start_node);
  180.  
  181.             int pom;
  182.             while (!s.isEmpty() && s.peek()!=end_node) {
  183.                 pom = s.peek();
  184.                 int pom1 = pom;
  185.                 for (int i = 0; i < g.getNum_nodes(); i++) {
  186.                     if(g.adjacent(pom,i)==1){
  187.                         pom1 = i;
  188.                         if(!visited[i])
  189.                             break;
  190.                     }
  191.                 }
  192.                 if(!visited[pom1]){
  193.                     visited[pom1] = true;
  194.                     //System.out.println(tmp.getIndex() + ": " + tmp.getInfo());
  195.                     s.push(pom1);
  196.                 }
  197.                 else
  198.                     s.pop();
  199.             }
  200.             if(s.isEmpty())
  201.                 System.out.println("Nema reshenie");
  202.             else{
  203.                 Stack<Integer> os = new Stack<Integer>();
  204.                 while(!s.isEmpty())
  205.                     os.push(s.pop());
  206.                 while(!os.isEmpty()){
  207.                     int key = os.pop();
  208.                     System.out.println(rehash.get(key+1));
  209.                 }
  210.  
  211.  
  212.             }
  213.         }
  214.  
  215.  
  216.  
  217.         public static void main(String args[]) throws IOException {
  218.             Maze m = new Maze();
  219.             BufferedReader in = new BufferedReader(new InputStreamReader(System.in));
  220.             String line = in.readLine();
  221.             String pom[] = line.split(",");
  222.             int rows = Integer.parseInt(pom[0]);
  223.             int columns = Integer.parseInt(pom[1]);
  224.  
  225.             String input[] = new String[rows];
  226.             for(int i = 0; i < rows; i++){
  227.                 input[i] = in.readLine();
  228.             }
  229.  
  230.  
  231.             m.generateGraph(rows, columns, input);
  232.             System.out.println("Pateka:");
  233.             m.findPath();
  234. /*
  235.  
  236.             String[] in = new String[rows];
  237.             Maze m = new Maze();
  238.             int rows = 6;
  239.             int columns = 6;
  240.             in[0] = "######";
  241.             in[1] = "# # ##";
  242.             in[2] = "# # S#";
  243.             in[3] = "# # ##";
  244.             in[4] = "# E  #";
  245.             in[5] = "######";
  246.  
  247.             m.generateGraph(rows, columns, in);
  248.             System.out.println("Pateka:");
  249.             m.findPath();
  250. */
  251.  
  252.  
  253.  
  254.         }
  255.  
  256.     }
  257.  
  258.  
  259.  
  260. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement