Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- import java.io.*;
- import java.util.*;
- public class Main {
- private static void nulled(boolean[] inClass) {
- for (int i = 0; i < inClass.length; i++) {
- inClass[i] = false;
- }
- }
- public static void main(String[] args) throws IOException {
- Scanner sc = new Scanner(new FileReader("D:\\input.txt"));
- int n = sc.nextInt();
- int m = sc.nextInt();
- String[][] move = new String[n][m];
- String[][] outS = new String[n][m];
- boolean[] inClass = new boolean[m];
- int count=0, old =0;
- HashMap<Character, ArrayList<Integer>> prev= new HashMap<Character, ArrayList<Integer>>();
- HashMap<Character, ArrayList<Integer>> next= new HashMap<Character, ArrayList<Integer>>();
- HashMap<Integer, Character> currentClass = new HashMap<Integer, Character>();
- HashMap<Integer, Character> prevClass = new HashMap<Integer, Character>();
- int iter=0;
- ArrayList<Integer> cls,getClass;
- for (int i = 0; i < n; i++) { //считывание из файла таблицы выходов
- for (int j = 0; j < m; j++) {
- outS[i][j] = sc.next();
- }
- }
- for (int i = 0; i < n; i++) { //считывание из файла таблицы входов
- for (int j = 0; j < m; j++) {
- move[i][j] = sc.next();
- }
- }
- String firstSt, secondSt;
- boolean usl = true;
- nulled(inClass);
- iter=0;
- for (int k = 0; k < m; k++) { //проход по матрице выходов
- if (!inClass[k]) { //если текущая вершина ещё не добавлена
- cls = new ArrayList<Integer>();
- firstSt = "";
- for (int i = 0; i < n; i++) {
- firstSt += outS[i][k];
- }
- for (int j = k; j < m; j++) {
- if (!inClass[j]) {
- secondSt = "";
- for (int i = 0; i < n; i++) { //сбор последующих строк
- secondSt += outS[i][j];
- }
- if (secondSt.equals(firstSt)) { //если одинаковые строки, то мы добавляем в текущий класс текущую
- inClass[j] = true;
- cls.add(j);
- prevClass.put(j,(char) (65+iter));
- }
- }
- }
- prev.put((char) (65+iter), cls);
- iter++;
- }
- }
- while (usl) {
- usl = false;
- for (Map.Entry<Character, ArrayList<Integer>> entry : prev.entrySet()) { //замена таблицы вхыодов на названия экв классов
- char key = entry.getKey();
- cls = entry.getValue();
- for (int p = 0; p < cls.size(); p++) {
- for (int i = 0; i < n; i++) {
- for (int j = 0; j < m; j++) {
- if (Integer.parseInt(move[i][j]) == cls.get(p) + 1)
- outS[i][j] = "" + key;
- }
- }
- }
- }
- nulled(inClass);
- old = iter;
- iter=0;
- next.clear();
- currentClass = new HashMap<Integer, Character>();
- for (int k = 0; k < m; k++) { //проход по матрице выходов
- if (!inClass[k]) { //если текущая вершина ещё не добавлена
- cls = new ArrayList<Integer>();
- firstSt = "";
- for (int i = 0; i < n; i++) {
- firstSt += outS[i][k];
- }
- for (int j = k; j < m; j++) {
- if (!inClass[j]) {
- secondSt = "";
- for (int i = 0; i < n; i++) { //сбор последующих строк
- secondSt += outS[i][j];
- }
- if (secondSt.equals(firstSt)) { //если одинаковые строки, то мы добавляем в текущий класс текущую
- if (prevClass.get(j) == prevClass.get(k)){
- inClass[j] = true;
- cls.add(j);
- currentClass.put(j,(char) (65+iter));
- }
- }
- }
- }
- next.put((char) (65+iter), cls);
- iter++;
- }
- }
- if (old<iter) {
- usl = true;
- prev = next;
- prevClass = currentClass;
- }
- } // end while
- System.out.println();
- // for (int i = 0; i < n; i++) {
- // for (int j = 0; j < m; j++) {
- // System.out.print(move[i][j]+" ");
- // }
- // System.out.println();
- // }
- //
- for (int i = 0; i < n; i++) {
- for (int j = 0; j < m; j++) {
- System.out.print(outS[i][j]+" ");
- }
- System.out.println();
- }
- }
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement