Advertisement
Guest User

Минимизация автомата Мили

a guest
May 28th, 2016
78
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Java 5.40 KB | None | 0 0
  1. import java.io.*;
  2. import java.util.*;
  3.  
  4.  
  5.  
  6. public class Main {
  7.  
  8.     private static void nulled(boolean[] inClass) {
  9.         for (int i = 0; i < inClass.length; i++) {
  10.             inClass[i] = false;
  11.         }
  12.     }
  13.  
  14.  
  15.     public static void main(String[] args) throws IOException {
  16.         Scanner sc = new Scanner(new FileReader("D:\\input.txt"));
  17.         int n = sc.nextInt();
  18.         int m = sc.nextInt();
  19.         String[][] move = new String[n][m];
  20.         String[][] outS = new String[n][m];
  21.         boolean[] inClass = new boolean[m];
  22.         int count=0, old =0;
  23.         HashMap<Character, ArrayList<Integer>> prev= new HashMap<Character, ArrayList<Integer>>();
  24.         HashMap<Character, ArrayList<Integer>> next= new HashMap<Character, ArrayList<Integer>>();
  25.         HashMap<Integer, Character> currentClass = new HashMap<Integer, Character>();
  26.         HashMap<Integer, Character> prevClass = new HashMap<Integer, Character>();
  27.         int iter=0;
  28.         ArrayList<Integer> cls,getClass;
  29.  
  30.         for (int i = 0; i < n; i++) {         //считывание из файла таблицы выходов
  31.             for (int j = 0; j < m; j++) {
  32.                 outS[i][j] = sc.next();
  33.             }
  34.         }
  35.         for (int i = 0; i < n; i++) {         //считывание из файла таблицы входов
  36.             for (int j = 0; j < m; j++) {
  37.                 move[i][j] = sc.next();
  38.             }
  39.         }
  40.         String firstSt, secondSt;
  41.         boolean usl = true;
  42.  
  43.  
  44.         nulled(inClass);
  45.  
  46.         iter=0;
  47.         for (int k = 0; k < m; k++) {   //проход по матрице выходов
  48.             if (!inClass[k]) {          //если текущая вершина ещё не добавлена
  49.                 cls = new ArrayList<Integer>();
  50.                 firstSt = "";
  51.                 for (int i = 0; i < n; i++) {
  52.                     firstSt += outS[i][k];
  53.                 }
  54.  
  55.                 for (int j = k; j < m; j++) {
  56.                     if (!inClass[j]) {
  57.                         secondSt = "";
  58.                         for (int i = 0; i < n; i++) {    //сбор последующих строк
  59.                             secondSt += outS[i][j];
  60.                         }
  61.                         if (secondSt.equals(firstSt)) {   //если одинаковые строки, то мы добавляем в текущий класс текущую
  62.                             inClass[j] = true;
  63.                             cls.add(j);
  64.                             prevClass.put(j,(char) (65+iter));
  65.                         }
  66.                     }
  67.                 }
  68.  
  69.                 prev.put((char) (65+iter), cls);
  70.                 iter++;
  71.  
  72.             }
  73.         }
  74.     while (usl) {
  75.         usl = false;
  76.         for (Map.Entry<Character, ArrayList<Integer>> entry : prev.entrySet()) {  //замена таблицы вхыодов на названия экв классов
  77.             char key = entry.getKey();
  78.             cls = entry.getValue();
  79.             for (int p = 0; p < cls.size(); p++) {
  80.                 for (int i = 0; i < n; i++) {
  81.                     for (int j = 0; j < m; j++) {
  82.                         if (Integer.parseInt(move[i][j]) == cls.get(p) + 1)
  83.                             outS[i][j] = "" + key;
  84.                     }
  85.                 }
  86.             }
  87.         }
  88.  
  89.  
  90.         nulled(inClass);
  91.         old = iter;
  92.         iter=0;
  93.         next.clear();
  94.         currentClass  = new  HashMap<Integer, Character>();
  95.         for (int k = 0; k < m; k++) {   //проход по матрице выходов
  96.             if (!inClass[k]) {          //если текущая вершина ещё не добавлена
  97.                 cls = new ArrayList<Integer>();
  98.                 firstSt = "";
  99.                 for (int i = 0; i < n; i++) {
  100.                     firstSt += outS[i][k];
  101.                 }
  102.  
  103.                 for (int j = k; j < m; j++) {
  104.                     if (!inClass[j]) {
  105.                         secondSt = "";
  106.                         for (int i = 0; i < n; i++) {    //сбор последующих строк
  107.                             secondSt += outS[i][j];
  108.                         }
  109.                         if (secondSt.equals(firstSt)) {   //если одинаковые строки, то мы добавляем в текущий класс текущую
  110.                             if (prevClass.get(j) == prevClass.get(k)){
  111.                                 inClass[j] = true;
  112.                                 cls.add(j);
  113.                                 currentClass.put(j,(char) (65+iter));
  114.                             }
  115.                         }
  116.                     }
  117.                 }
  118.  
  119.                 next.put((char) (65+iter), cls);
  120.                 iter++;
  121.  
  122.             }
  123.         }
  124.  
  125.  
  126.  
  127.         if (old<iter) {
  128.             usl = true;
  129.             prev = next;
  130.             prevClass = currentClass;
  131.         }
  132.  
  133.     } // end while
  134.  
  135.         System.out.println();
  136.  
  137.  
  138. //        for (int i = 0; i < n; i++) {
  139. //            for (int j = 0; j < m; j++) {
  140. //                System.out.print(move[i][j]+" ");
  141. //            }
  142. //            System.out.println();
  143. //        }
  144. //
  145.         for (int i = 0; i < n; i++) {
  146.             for (int j = 0; j < m; j++) {
  147.                 System.out.print(outS[i][j]+" ");
  148.             }
  149.             System.out.println();
  150.         }
  151.  
  152.  
  153.     }
  154. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement