Advertisement
osipyonok

SP LAB 2

Sep 22nd, 2016
114
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Java 7.17 KB | None | 0 0
  1. ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  2. /////////////////////////////lab2.java
  3.  
  4. package lab2SP;
  5.  
  6. import java.io.File;
  7. import java.io.FileNotFoundException;
  8. import java.util.Scanner;
  9. import java.util.*;
  10.  
  11.  
  12.  
  13. public class lab2 {
  14.     public static void main(String[] args) {
  15.         Automata<Integer> a1 = Scan("input1.in");
  16.         Automata<Integer> a2 = Scan("input2.in");
  17.         Automata<Pair<Integer , Integer> > m = Multiply(a1 , a2);
  18.     //  System.out.println(m.s.first() + " " + m.s.second());
  19.         for(Pair<Integer , Integer> i: m.S){
  20.             //System.out.println(i.first() + " " + i.second());
  21.         }
  22.         ArrayList<Pair<Integer , Integer> > path = m.Solve();
  23.        
  24.         if(path.size() > 1){
  25.             for(int i = 0 ; i < path.size() - 1; ++i){
  26.                 for(Pair<Pair<Integer, Integer>, Pair<Integer, Integer>> j : m.inverse_f.keySet()){
  27.                     if(j.first().first() == path.get(i).first()
  28.                       && j.first().second() == path.get(i).second()
  29.                       && j.second().first() == path.get(i + 1).first()
  30.                       && j.second().second() == path.get(i + 1).second())                  
  31.                     {
  32.                         System.out.print(m.inverse_f.get(j));
  33.                     }
  34.                 }
  35.             }
  36.         }
  37.  
  38.     }
  39.     static Automata<Integer> Scan(String file){
  40.         Automata<Integer> a1 = null;
  41.         try{
  42.             Scanner in = new Scanner(new File(file));
  43.             int A , S1 , s;
  44.             A = in.nextInt();
  45.             S1 = in.nextInt();
  46.             s = in.nextInt();
  47.             Set<Integer> S = new HashSet<Integer>();
  48.             for(int i = 0 ; i < S1 ; ++i)S.add(i);
  49.             int t;
  50.             t = in.nextInt();
  51.             Set<Integer> F = new HashSet<Integer>();
  52.             for(int i = 0 ; i < t ; ++i){
  53.                 F.add(in.nextInt());
  54.             }
  55.            
  56.             Map<Pair<Integer , Character> , Integer> f = new HashMap<Pair<Integer , Character> , Integer>();
  57.             while(in.hasNextLine()){
  58.                 int u , v;
  59.                 char c;
  60.                 u = in.nextInt();
  61.                 c = in.next().charAt(0);
  62.                 v = in.nextInt();
  63.                 Pair<Integer , Character> pr = new Pair<Integer , Character>(u , c);
  64.                 f.put(pr , v);
  65.             }
  66.            
  67.             a1 = new Automata<Integer>(A , S , s , F , f);
  68.             in.close();
  69.         }catch(FileNotFoundException e){
  70.             System.out.print("File input1.in not found :( ");
  71.         }
  72.         return a1;
  73.     }
  74.    
  75.     static <T> Automata<Pair<T , T> > Multiply (Automata<T> a , Automata<T> b){
  76.         int new_A = Math.max(a.A, b.A);
  77.         Set<Pair<T , T> > new_S = new HashSet<Pair<T , T> >();
  78.         for(T i: a.S){
  79.             for(T j: b.S){
  80.                 Pair<T , T> pr = new Pair<T, T>(i , j);
  81.                 new_S.add(pr);
  82.             }
  83.         }
  84.         Set<Pair<T , T> > new_F = new HashSet<Pair<T , T> >();
  85.         for(T i: a.F){
  86.             for(T j: b.F){
  87.                 Pair<T , T> pr = new Pair<T , T>(i , j);
  88.                 new_F.add(pr);
  89.             }
  90.         }
  91.         Pair<T , T> new_s = new Pair<T , T>(a.s , b.s);
  92.         Map<Pair<Pair<T , T> , Character> , Pair<T , T> > new_f = new HashMap<Pair<Pair<T , T> , Character> , Pair<T , T> >();
  93.        
  94.         for(Pair<T , Character> i : a.f.keySet()){
  95.             for(Pair<T , Character> j : b.f.keySet()){
  96.                 if(i.second() != j.second())continue;
  97.                 for(Pair<T , T> k : new_S){
  98.                     if(i.first() == k.first() && j.first() == k.second()){
  99.                         Pair<Pair<T , T> , Character> pr = new Pair<Pair<T , T> , Character>(k , (char)i.second());
  100.                         Pair<T , T> put_pair = new Pair<T, T>(a.f.get(i) , b.f.get(j));
  101.                         new_f.put(pr, put_pair);
  102.                     }
  103.                 }
  104.             }
  105.         }
  106.         Automata<Pair<T , T> > res = new Automata<Pair<T , T> >(new_A , new_S , new_s , new_F , new_f);
  107.         return res;
  108.     }
  109. }
  110.  
  111. ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  112. //////////////////////Automata.java
  113.  
  114. package lab2SP;
  115.  
  116. import java.io.File;
  117. import java.io.FileNotFoundException;
  118. import java.util.Scanner;
  119. import java.util.*;
  120.  
  121. public class Automata<T> {
  122.     int A;
  123.     T s;
  124.     Set<T> S = new HashSet<T>();
  125.     Set<T> F = new HashSet<T>();
  126.     Map<Pair<T , Character> , T> f = new HashMap<Pair<T , Character> , T>();
  127.     Map<Pair<T , T> , Character> inverse_f = new HashMap<Pair<T , T> , Character>();
  128.    
  129.     Automata(int _A , Set<T> _S , T _s , Set<T> _F , Map<Pair<T , Character> , T> _f){
  130.         A = _A;
  131.         s = _s;
  132.         S = _S;
  133.         F = _F;
  134.         f = _f;
  135.         for(Map.Entry<Pair<T , Character> , T> i : f.entrySet()){
  136.             Pair<T , T> pr = new Pair<T , T>(i.getKey().first() , i.getValue());
  137.             inverse_f.put(pr , i.getKey().second());
  138.         }
  139.     }
  140.    
  141.     T bfs(Map<T , Integer> d , Map<T , T> p , Map<T , Boolean> used){
  142.     //  Queue<T> q = new PriorotyQueue<T>();
  143.         Set<T> q = new HashSet<T>();
  144.         q.add(s);
  145.         used.put(s ,  true);
  146.         T ret = s;
  147.         p.put(s , s);
  148.         d.put(s ,  0);
  149.         boolean flag = false;
  150.         while(q.size() > 0){   
  151.             T v = q.iterator().next();//q.poll();
  152.             q.remove(v);
  153.         //  q.peek();
  154.             for(Pair<T , Character> i: f.keySet()){
  155.                 //System.out.println(((Pair)(i.first())).first() + " " + ((Pair)(i.first())).second() + " and " + ((Pair)(v)).first() + " " + ((Pair)(v)).second());
  156.                 if(((Pair)(i.first())).first() == ((Pair)(v)).first() && ((Pair)(i.first())).second() == ((Pair)(v)).second()){
  157.                 //if(i.first().equals(v)){
  158.                    
  159.                     T to = f.get(i);
  160.                     try{
  161.                         if(used.get(to) == false);
  162.                     }catch(java.lang.NullPointerException e){
  163.                         used.put(to , false);
  164.                     }
  165.                     if(used.get(to) == false){
  166.                         used.put(to , true);
  167.                         q.add(to);
  168.                         d.put(to, d.get(v) + 1);
  169.                         p.put(to, v);
  170.                         for(T j : F){
  171.                             if((int)((Pair)(to)).first() == (int)((Pair)(j)).first() && (int)((Pair)(to)).second() == (int)((Pair)(j)).second()){
  172.                                 ret = to;                      
  173.                             //  System.out.println("We have found a finish vertex!");
  174.                                 flag = true;
  175.                                 break;
  176.                             }
  177.                         }
  178.                     /*  if(F.contains(to)){                
  179.                             ret = to;                      
  180.                             System.out.println("We have found a finish vertex!");
  181.                             flag = true;
  182.                             break;
  183.                         }*/
  184.                     }
  185.                 }
  186.             }
  187.             if(flag)break;
  188.         }
  189.         return ret;    
  190.     }
  191.    
  192.     ArrayList<T> Solve(){
  193.         Map<T , Integer> d = new HashMap<T , Integer>();
  194.         Map<T , T> p = new HashMap<T , T>();
  195.         Map<T , Boolean> used = new HashMap<T , Boolean>();
  196.         T need = bfs(d , p , used);
  197.        
  198.         ArrayList<T> path = new ArrayList<T>();
  199.         if(need == s){
  200.             System.out.println("Such word does not exist :(");
  201.             return path;
  202.         }
  203.         boolean ck = true;
  204.         for(T v = need ; ck && v != s ; v = p.get(v)){
  205.             path.add(v);
  206.             if(v == s)ck = false;
  207.         }
  208.         path.add(s);
  209.         Collections.reverse(path);
  210.         return path;
  211.     }
  212. }
  213.  
  214. ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  215. //////////////////////////////////////Pair.java
  216.  
  217. package lab2SP;
  218.  
  219. public class Pair<T1 , T2> {
  220.     T1 x;
  221.     T2 y;
  222.     Pair(T1 _x , T2 _y){
  223.         x = _x;
  224.         y = _y;
  225.     }
  226.     T1 first(){
  227.         return x;
  228.     }
  229.     T2 second(){
  230.         return y;
  231.     }
  232.    
  233.     boolean equals(Pair<T1 , T2> other){
  234.         return ((Object)this.x == (Object)other.x && (Object)this.y == (Object)other.y);
  235.     }
  236. }
  237.  
  238. /////////////////////////////////////////////////////////////////////////////////////////////////////////
  239. ////////////////////INPUT EXAMPLE
  240. /*
  241. 3
  242. 6
  243. 0
  244. 1 5
  245. 0 b 2
  246. 0 a 1
  247. 1 b 3
  248. 2 a 3
  249. 3 a 4
  250. 3 b 0
  251. 4 a 2
  252. 4 c 5
  253. 4 b 1
  254.  
  255.  
  256.  
  257. 3
  258. 7
  259. 0
  260. 1 6
  261. 0 a 1
  262. 0 b 2
  263. 0 c 3
  264. 1 a 4
  265. 2 a 4
  266. 2 b 3
  267. 3 b 4
  268. 4 a 5
  269. 4 b 3
  270. 4 c 0
  271. 5 a 1
  272. 5 c 6
  273. 5 b 3
  274. */
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement