Advertisement
Guest User

Daaada

a guest
Nov 22nd, 2014
159
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Java 14.17 KB | None | 0 0
  1. /*
  2.  * To change this license header, choose License Headers in Project Properties.
  3.  * To change this template file, choose Tools | Templates
  4.  * and open the template in the editor.
  5.  */
  6. package pal;
  7.  
  8. import java.io.BufferedReader;
  9. import java.io.IOException;
  10. import java.io.InputStreamReader;
  11.  
  12. /**
  13.  *
  14.  * @author Dada
  15.  */
  16. class MatchBelts {
  17.  
  18.     private int numberOfBelts;
  19.     private int numberOfSegments;
  20.     private int numberOfDisks;
  21.  
  22.     private int actualFreePositionInOutput;
  23.     private boolean directionOfDiskOnBelt; //true = left; false = right
  24.     private int maxBeltsOnRow;
  25.     private int minBeltsOnRow;
  26.     private int actualPositionInOutput;
  27.  
  28.     private String[][] loadedBelts;
  29.     private String[] output;
  30.     private int[][] outputNumeric;
  31.     private int[][] sortedOutput;
  32.     private int occurrence[];
  33.     private boolean[] isSorted;
  34.  
  35.     void loadValues() throws IOException {
  36.         BufferedReader bi = new BufferedReader(new InputStreamReader(System.in));
  37.         String line;
  38.  
  39.         //load first row
  40.         setBasicValues(bi);
  41.  
  42.         //vytvoreni potrebnych poli
  43.         createArrays();
  44.  
  45.         //nacitani pasku
  46.         for (int i = 0; i < numberOfBelts; i++) {
  47.             loadBelt(bi, i);
  48.         }
  49.  
  50. //zda jsou dobre nactene
  51. //        for (int i = 0; i < numberOfBelts; i++) {
  52. //            for (int j = 0; j < numberOfDisks; j++) {
  53. //                System.out.print(loadedBelts[i][j] + "|");
  54. //            }
  55. //            System.out.println("");
  56. //        }
  57. //jak je nadefinovane pole isSorted
  58. //        for (int i = 0; i < numberOfBelts; i++) {
  59. //            System.out.println(isSorted[i]);
  60. //        }
  61. //jak je nadefinovane pole output
  62. //        for (int i = 0; i < numberOfBelts; i++) {
  63. //            System.out.println(output[i]);
  64. //        }
  65.     }
  66.  
  67.     private void setBasicValues(BufferedReader bi) throws IOException {
  68.         actualFreePositionInOutput = 0;
  69.         directionOfDiskOnBelt = false;
  70.         maxBeltsOnRow = 0;
  71.         minBeltsOnRow = 0;
  72.  
  73.         String line = bi.readLine();
  74.         String[] split = line.split("\\s");
  75.         numberOfBelts = Integer.parseInt(split[0]);
  76.         numberOfSegments = Integer.parseInt(split[1]);
  77.         numberOfDisks = Integer.parseInt(split[2]);
  78.     }
  79.  
  80.     private void createArrays() {
  81.         //ulozene stringy z nactenych disku
  82.         loadedBelts = new String[numberOfBelts][numberOfDisks];
  83.  
  84.         //pole stringu pro vypis
  85.         output = new String[numberOfBelts];
  86.         //pole pro sortovani vystupu
  87.         outputNumeric = new int[numberOfBelts][2];
  88.         sortedOutput = new int[numberOfBelts][2];
  89.  
  90.         //pole jiz zarazenych beltu
  91.         isSorted = new boolean[numberOfBelts];
  92.     }
  93.  
  94.     private void loadBelt(BufferedReader bi, int i) throws IOException {
  95.         String line;
  96.         line = bi.readLine();
  97.         String[] split = line.split("\\s");
  98.  
  99.         //nacita jednotlive stringy
  100.         for (int j = 0; j < numberOfDisks; j++) {
  101.             loadedBelts[i][j] = split[j + 1];
  102.         }
  103.     }
  104.  
  105.     void findMatches() {
  106.         String doubledDisk;//zdvojeny string jednoho disku
  107.         actualPositionInOutput = 0;
  108.         boolean actualPositionInOutpusIsSet = false;
  109.         boolean sameBelts = false;
  110.  
  111.         for (int i = 0; i < numberOfBelts; i++) {//kazdy pasek postupne. 0,1,2...
  112.             actualPositionInOutpusIsSet = false;
  113.             for (int j = i + 1; j < numberOfBelts; j++) {//musim porovnat s kazdym paskem, ale uz nemusim s tim ktery jsem kontroloval predtim proto od i
  114.                 if (isSorted[j] == false) {//pokud uz je pasek zarazen je zbytecne ho znovu kontrolovat
  115.  
  116.                     for (int k = 0; k < numberOfDisks; k++) {//z prvniho pasku z prvniho foru bere jeden disk za druhym, bude je kontrolvoat s disky z dalsiho
  117.                         doubledDisk = loadedBelts[i][k] + loadedBelts[i][k];//definuji uz tady aby se nemusel tento string vytvaret porad
  118.                         for (int l = 0; l < numberOfDisks; l++) {//s disky z druheho foru bude kontrolovat disk z foru tretiho
  119.                             if (isSame(doubledDisk, j, l) == true) {//pokud je nalezena shoda disku
  120.                                 //System.out.println("same " + i + "-" + k + " | " + j + "-" + l);//funguje
  121.                                 sameBelts = checkBelts(i, k, j, l);//resi zda jsou dalsi disky vedle nalezene shody ty spravne
  122.                                 if (sameBelts == true) {//nalezena shoda
  123.                                     isSorted[i] = true;//uz jsou nalezeny schody je zbytecny ej znova pouzivat
  124.                                     isSorted[j] = true;//uz jsou nalezeny schody je zbytecny ej znova pouzivat
  125.                                     if (actualPositionInOutpusIsSet == false) {//pokud nebyl jeste do outputu zarazen zadny prvek ktery by se schodoval s paskem na pozici "i"
  126.                                         actualPositionInOutput++;
  127.                                     }
  128.                                     addToOuput(i, j, actualPositionInOutput - 1);//prida do stringu outputu labely shodnych pasku
  129.  
  130.                                     actualPositionInOutpusIsSet = true;
  131.                                     break;
  132.                                 }
  133.                             }
  134.                         }
  135.                         if (sameBelts == true) {
  136.                             break;
  137.                         }
  138.                     }
  139.  
  140.                 }
  141.             }
  142.             if (isSorted[i] == false) {//resi kdyz porovnam pasek se vsemi a nidke nenajdu shodu
  143.                 actualPositionInOutput++;
  144.                 addToOuput(-1, i, actualPositionInOutput - 1);//bacha lehka modifikace i a j je prohozene
  145.             }
  146.         }
  147.  
  148. //        System.out.println("--------------------------OUTPUT--------------------------");
  149. //        int position = 0;
  150. //        System.out.println(actualPositionInOutput);
  151. //        while (output[position] != null) {
  152. //            System.out.println(output[position]);
  153. //            position++;
  154. //        }
  155.  
  156.     }
  157.  
  158.     private boolean isSame(String doubledDisk, int j, int l) {
  159.         //disky jsou stejne
  160.         if (doubledDisk.contains(loadedBelts[j][l])) {
  161.             return true;
  162.         }
  163.  
  164.         //zda obsahuje rotaci disku
  165.         return doubledDisk.contains(rotate(loadedBelts[j][l]));
  166.     }
  167.  
  168.     private CharSequence rotate(String disk) {
  169.         StringBuilder diskBuilder = new StringBuilder(disk);
  170.         return diskBuilder.reverse().toString();
  171.     }
  172.  
  173.     private boolean checkBelts(int firstBelt, int firstDisk, int secondBelt, int secondDisk) {
  174.         int actualSecondDisk;
  175.         int actualFirstDisk;
  176.  
  177.         ////////////////kotrola zda je vpravo////////////////
  178.         actualFirstDisk = firstDisk + 1;//posun o jeden doprava
  179.         if (actualFirstDisk == numberOfDisks) {//pokud to byl disk ktery byl oznacen na pasku jako posledni tak dalsi vpravo je prvni z pasku
  180.             actualFirstDisk = 0;
  181.         }
  182.         String doubledDisk = loadedBelts[firstBelt][actualFirstDisk] + loadedBelts[firstBelt][actualFirstDisk];//definuji uz tady aby se nemusel tento string vytvaret porad
  183.  
  184.         actualSecondDisk = secondDisk + 1;//posun o jeden doprava
  185.         if (actualSecondDisk == numberOfDisks) {//pokud to byl disk ktery byl oznacen na pasku jako posledni tak dalsi vpravo je prvni z pasku
  186.             actualSecondDisk = 0;
  187.         }
  188.  
  189.         if (isSame(doubledDisk, secondBelt, actualSecondDisk) == true) {//pokud je nalezena shoda disku tak je smer doprava
  190.             //System.out.println("vpravo");
  191.             while (actualFirstDisk != firstDisk) {//objizdi cele kolo
  192.                 actualFirstDisk = actualFirstDisk + 1;//posun o jeden doprava
  193.                 if (actualFirstDisk == numberOfDisks) {//pokud to byl disk ktery byl oznacen na pasku jako posledni tak dalsi vpravo je prvni z pasku
  194.                     actualFirstDisk = 0;
  195.                 }
  196.                 doubledDisk = loadedBelts[firstBelt][actualFirstDisk] + loadedBelts[firstBelt][actualFirstDisk];//definuji uz tady aby se nemusel tento string vytvaret porad
  197.  
  198.                 actualSecondDisk = actualSecondDisk + 1;//posun o jeden doprava
  199.                 if (actualSecondDisk == numberOfDisks) {//pokud to byl disk ktery byl oznacen na pasku jako posledni tak dalsi vpravo je prvni z pasku
  200.                     actualSecondDisk = 0;
  201.                 }
  202.  
  203.                 //System.out.println(doubledDisk + "  " + loadedBelts[secondBelt][actualSecondDisk]);
  204.                 if (isSame(doubledDisk, secondBelt, actualSecondDisk) == false) {
  205.                     return false;
  206.                 }
  207.             }
  208.             return true;
  209.         }
  210.  
  211.         ////////////////kotrola zda je vlevo////////////////
  212.         actualSecondDisk = secondDisk - 1;//posun o jeden doprava
  213.         if (actualSecondDisk == - 1) {//pokud to byl disk ktery byl oznacen na pasku jako prvni tak dalsi vlevo je vlastne posledni
  214.             actualSecondDisk = numberOfDisks - 1;
  215.         }
  216.  
  217.         if (isSame(doubledDisk, secondBelt, actualSecondDisk) == true) {//pokud je nalezena shoda disku tak je smer vlevo
  218.             //System.out.println("vlevo");
  219.             while (actualFirstDisk != firstDisk) {//objizdi cele kolo
  220.                 actualFirstDisk = actualFirstDisk + 1;//posun o jeden doprava
  221.                 if (actualFirstDisk == numberOfDisks) {//pokud to byl disk ktery byl oznacen na pasku jako posledni tak dalsi vpravo je prvni z pasku
  222.                     actualFirstDisk = 0;
  223.                 }
  224.                 doubledDisk = loadedBelts[firstBelt][actualFirstDisk] + loadedBelts[firstBelt][actualFirstDisk];//definuji uz tady aby se nemusel tento string vytvaret porad
  225.  
  226.                 actualSecondDisk = actualSecondDisk - 1;//posun o jeden doprava
  227.                 if (actualSecondDisk == - 1) {//pokud to byl disk ktery byl oznacen na pasku jako prvni tak dalsi vlevo je vlastne posledni
  228.                     actualSecondDisk = numberOfDisks - 1;
  229.                 }
  230.  
  231.                 if (isSame(doubledDisk, secondBelt, actualSecondDisk) == false) {
  232.                     return false;
  233.                 }
  234.             }
  235.             return true;
  236.         }
  237.  
  238.         return false;
  239.     }
  240.  
  241.     private void addToOuput(int i, int j, int actualPositionInOutput) {
  242.         //System.out.println("addion to output...");
  243.         String helpa;
  244.  
  245.         if (i == -1) {
  246.             helpa = Integer.toString(j);
  247.             output[actualPositionInOutput] = helpa;
  248.             outputNumeric[actualPositionInOutput][1]++;
  249.             outputNumeric[actualPositionInOutput][0] = actualPositionInOutput;
  250.             if (outputNumeric[actualPositionInOutput][1] > maxBeltsOnRow) {
  251.                 maxBeltsOnRow = outputNumeric[actualPositionInOutput][1];
  252.             }
  253.             return;
  254.         }
  255.  
  256.         if (output[actualPositionInOutput] == null) {
  257.             helpa = i + " " + j;
  258.             output[actualPositionInOutput] = helpa;
  259.             outputNumeric[actualPositionInOutput][1] += 2;
  260.             outputNumeric[actualPositionInOutput][0] = actualPositionInOutput;
  261.             if (outputNumeric[actualPositionInOutput][1] > maxBeltsOnRow) {
  262.                 maxBeltsOnRow = outputNumeric[actualPositionInOutput][1];
  263.             }
  264.             return;
  265.         } else {
  266.             helpa = " " + j;
  267.             output[actualPositionInOutput] = output[actualPositionInOutput] + helpa;
  268.             outputNumeric[actualPositionInOutput][1]++;
  269.             outputNumeric[actualPositionInOutput][0] = actualPositionInOutput;
  270.             if (outputNumeric[actualPositionInOutput][1] > maxBeltsOnRow) {
  271.                 maxBeltsOnRow = outputNumeric[actualPositionInOutput][1];
  272.             }
  273.             return;
  274.         }
  275.     }
  276.  
  277.     void sortOutput() {
  278. //        System.out.println("---------------------------SORTED INTEGERS--------------------");
  279. //        for (int i = 0; i < actualPositionInOutput; i++) {
  280. //            System.out.println(outputNumeric[i][0] + " | " + outputNumeric[i][1]);
  281. //        }
  282.        
  283. //        System.out.println("---------------------------SORTING--------------------");
  284.         countingSort();
  285.     }
  286.  
  287.     void countingSort() {
  288.         //nastavi velikost priznakoveho pole
  289.         setOccurrenceSize();
  290.         //nastavi priznakovemu poly pocty vyskytu
  291.         setNumberOfOccurrence();
  292. //        for (int i = 0; i < occurrence.length; i++) {
  293. //            System.out.println(occurrence[i]);            
  294. //        }
  295.         //nastavi posledni indexy
  296.         setTheLastIndex();
  297.         //serad pole
  298.         sortArray();
  299.  
  300. //        for (int i = 0; i < actualPositionInOutput; i++) {
  301. //            System.out.print(sortedOutput[i][0] + " " + sortedOutput[i][1]);
  302. //            System.out.println("");
  303. //        }
  304.     }
  305.  
  306.     private void setOccurrenceSize() {
  307.         occurrence = new int[maxBeltsOnRow - minBeltsOnRow + 1];//new int[maxBeltsOnRow - minBeltsOnRow + 1];//TODO
  308.     }
  309.  
  310.     private void setNumberOfOccurrence() {
  311.         for (int i = 0; i < actualPositionInOutput; i++) {
  312. //            System.out.println(outputNumeric[i][1]);
  313.             occurrence[outputNumeric[i][1] - minBeltsOnRow]++;
  314.         }
  315.     }
  316.  
  317.     private void setTheLastIndex() {
  318.         occurrence[0]--;
  319.         for (int i = 1; i < occurrence.length; i++) {
  320.             occurrence[i] += occurrence[i - 1];
  321.         }
  322.     }
  323.  
  324.     private void sortArray() {
  325. //        System.out.println("sort array");
  326.         for (int i = 0; i  < actualPositionInOutput; i++) {
  327.         //for (int i = actualPositionInOutput - 1; i >= 0; i--) {
  328.             int c = outputNumeric[i][1] - minBeltsOnRow;
  329. //            System.out.println("pozice v vyskytu " + c);
  330.             int s = occurrence[c];
  331. //            System.out.println("pozice cisla " + s);
  332.             sortedOutput[s][0] = outputNumeric[i][0];
  333.             sortedOutput[s][1] = outputNumeric[i][1];
  334.  
  335.             occurrence[c]--;
  336.         }
  337.  
  338.     }
  339.  
  340.     void output() {
  341. //        System.out.println("----------------------OUTPUT------------------------");
  342.         System.out.println(actualPositionInOutput);
  343.         for (int i = actualPositionInOutput-1; i >=0; i--) {
  344.             System.out.println(output[sortedOutput[i][0]]);
  345.         }
  346.     }
  347. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement