Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- import java.io.BufferedReader;
- import java.io.FileReader;
- import java.io.IOException;
- import java.util.LinkedList;
- import java.util.List;
- public class Hakbat_Sul {
- static int Players=5,Rank=TheRank(Players),Games=TheGames(Players),t=0,row,column,numofgames;
- static double firstodd,secondodd,Total;
- static double TheMainBoard[][]=new double [Rank][Games+1];
- static double TheMultyBoard[][]=new double [Rank][Games];
- static double TheFinalBoard[]=new double [Games+1];
- static String TheGameBoard[]=new String [Games];
- static String TheRankBoard[][]=new String [Rank][Players];
- static int ThePlayerboard[]= new int[Players];
- static int TheRankingBoard[][]= new int [Players][Players];
- static double TheODDBoard[][]= new double [Rank][Games];
- static String TheFirstRank[]=new String [Players];
- public static void main(String[] args) {
- readFromFile();
- row=0;
- column=0;
- Total=0;
- FillPlayers();
- ranks();
- MakeGameBoard();
- MakeRank();
- MakingTheOddTable();
- TheLastTable();
- Solve();
- System.out.print(TheFinalBoard[Players]);
- }
- private static void readFromFile(){
- try(BufferedReader br = new BufferedReader(new FileReader("input.txt"))) {
- StringBuilder sb = new StringBuilder();
- String line = br.readLine();
- List<String> Result=new LinkedList<String>(); //intialize List of Strings
- Result.add(line); //add First Line (String) to the List
- while (line != null) {
- sb.append(line);
- sb.append(System.lineSeparator());
- line = br.readLine();
- Result.add(line);
- }
- String[] array = Result.toArray(new String[Result.size()]);
- setValuesFrom(array);
- }
- catch (IOException e) {
- e.printStackTrace();
- }
- }
- private static void setValuesFrom(String[] File){
- for (int i=0;i<File.length;i++){
- switch (File[i].charAt(0)){
- case 'n':
- String re=File[i].substring(2);
- Players=Integer.valueOf(re);
- break;
- case 'k':
- String res=File[i].substring(2);
- numofgames=Integer.valueOf(res);
- break;
- case 'R':
- i=i+2;
- for (int j=0;j<Players;j++){ //Adding Ranking - index 0 is first place
- TheFirstRank[j]=File[i];
- i=i+1;
- }
- case 'B':
- i=i+1;
- int c=Players-1;
- while (c>=0){
- if (!Character.isDigit(File[i].charAt(0)))
- i++;
- else {
- for (int r=0;r<TheRankingBoard.length;r++){
- TheRankingBoard[r][c]=Integer.valueOf(File[i]); // transfering string to int
- i=i+1;
- }
- c--; // going one column to the left
- }
- }
- break;
- }
- }
- }
- private static void FillPlayers(){
- for (int i=0;i<Players;i++)
- ThePlayerboard[i]=i+1;
- }
- public static void TheLastTable(){
- double max =0;
- for(row=0;row<Rank;row++){
- for(column=0;column<Games;column++){
- if(TheMainBoard[row][column]>max) max = TheMainBoard[row][column];
- }
- TheMainBoard[row][Players]=max;
- max=0;
- }
- }
- public static void Solve(){
- numofgames=numofgames-1;
- while(numofgames!=1 ){
- for (row=0;row<Rank;row++){
- for (column=0;column<Games;column++){
- Total=TheMultyBoard[row][column];
- Total=Total+(TheODDBoard[row][column]*Win(TheRankBoard[row],TheGameBoard[column]))+((1-TheODDBoard[row][column])*Lost(TheRankBoard[row],TheGameBoard[column]));
- TheMainBoard[row][column]=Total;
- }
- }
- TheLastTable();
- numofgames=numofgames-1;
- }
- if(numofgames==1){
- int count =0;
- int rows =0;
- for(int j=0;j<Rank;j++){
- for(int k=0;k<Players;k++){
- if(TheFirstRank[k].equals(TheRankBoard[j][k])) count++;
- if(count==Players) rows=j;
- if(rows!=0) break;
- }
- if(rows!=0) break;
- count=0;
- }
- for (column=0;column<Games;column++){
- Total=TheMultyBoard[rows][column];
- Total=Total+(TheODDBoard[rows][column]*Win(TheRankBoard[rows],TheGameBoard[column]))+((1-TheODDBoard[rows][column])*Lost(TheRankBoard[rows],TheGameBoard[column]));
- TheFinalBoard[column]=Total;
- }
- TheFinal();
- }
- }
- private static void TheFinal() {
- double max =0;
- for(int i=0;i<Games;i++){
- if(TheFinalBoard[i]>max) max = TheFinalBoard[i];
- }
- TheFinalBoard[Players]=max;
- max=0;
- }
- public static double Win(String X[],String Y) {
- int count =0,rows=0;
- String Z[]=new String[X.length];
- for(int l=0;l<X.length;l++){
- Z[l]=X[l];
- }
- char winner = Y.charAt(0);
- char looser = Y.charAt(1);
- String temp;
- int i=0;
- int winnerplace=0,looserplace=0;
- while (i<Players){
- if(winner==Z[i].charAt(0)) winnerplace=i;
- if(looser==Z[i].charAt(0)) looserplace=i;
- i++;
- }
- for(int j=0;j<Rank;j++){
- for(int k=0;k<Players;k++){
- if(Z[k].equals(TheRankBoard[j][k])) count++;
- if(count==Players) rows=j;
- if(rows!=0) break;
- }
- if(rows!=0) break;
- count=0;
- }
- if(winnerplace<looserplace) return TheMainBoard[rows][Players];
- else{
- temp =Z[winnerplace];
- Z[winnerplace]=Z[looserplace];
- Z[looserplace]=temp;
- if(TheRankBoard[0][0]!=null);
- count=0;
- rows=0;
- for(int j=0;j<Rank;j++){
- for(int k=0;k<Players;k++){
- if(Z[k].equals(TheRankBoard[j][k])) count++;
- if(count==Players) rows=j;
- if(rows!=0) break;
- }
- if(rows!=0) break;
- count=0;
- }
- double x=TheMainBoard[rows][Players];
- return x;
- }
- }
- public static double Lost(String[] X,String Y) {
- String Z[]=new String[X.length];
- for(int l=0;l<X.length;l++){
- Z[l]=X[l];
- }
- char winner = Y.charAt(1);
- char looser = Y.charAt(0);
- String temp;
- int i=0,rows=0,count=0;
- int winnerplace=0,looserplace=0;
- while (i<Players){
- if(winner==Z[i].charAt(0)) winnerplace=i;
- if(looser==Z[i].charAt(0)) looserplace=i;
- i++;
- }
- for(int j=0;j<Rank;j++){
- for(int k=0;k<Players;k++){
- if(Z[k].equals(TheRankBoard[j][k])) count++;
- if(count==Players) rows=j;
- if(rows!=0) break;
- }
- if(rows!=0) break;
- count=0;
- }
- if(winnerplace<looserplace) return TheMainBoard[rows][Players];
- else{
- temp =Z[winnerplace];
- Z[winnerplace]=Z[looserplace];
- Z[looserplace]=temp;
- if(TheRankBoard[0][0]!=null);
- count=0;
- rows=0;
- for(int j=0;j<Rank;j++){
- for(int k=0;k<Players;k++){
- if(Z[k].equals(TheRankBoard[j][k])) count++;
- if(count==Players) rows=j;
- if(rows!=0) break;
- }
- if(rows!=0) break;
- count=0;
- }
- return TheMainBoard[rows][Players];
- }
- }
- public static int TheRank(int n){//עצרת כדי למצוא את גודל המערך
- if (n==0 || n==1)
- return 1;
- return n*TheRank(n-1);}
- public static int TheGames(int Games1){// כדי למצוא את גודל מערך של המשחקים
- int Games2=(TheRank(Games1)/(TheRank(Games1-2)*TheRank(2)));
- return Games2;
- }
- public static void ranks(){
- for (int i=0;i<Rank;i++)
- for (int j=0;j<Players;j++) TheRankBoard[i][j]="";
- }
- public static void MakeGameBoard(){
- for (int i=1;i<Players;i++){
- ThePlayerboard[i-1]=i;
- }
- int i=0;
- for(int Firstplayer=1;Firstplayer<=Players;Firstplayer++){
- for (int second=2;second<=Players;second++){
- if (Firstplayer<second){
- String game=""+Firstplayer+""+second;
- TheGameBoard[i]=game;
- i++;
- }
- }
- }
- }
- public static void MakeRank(){
- Hakbat_Sul p=new Hakbat_Sul();
- p.permute(ThePlayerboard, 0);}
- public void printArray(int []a) {
- for (int i = 0; i<a.length; i++) {
- TheRankBoard[t][i]=""+a[i];
- }
- t++;
- }
- public void permute(int []a,int k ) {
- if(k==a.length)
- printArray(a);
- else
- for (int i = k; i <a.length; i++) {
- int temp=a[k];
- a[k]=a[i];
- a[i]=temp;
- permute(a,k+1);
- temp=a[k];
- a[k]=a[i];
- a[i]=temp;}
- }
- public static void MakingTheOddTable(){
- for (int i=0;i<Rank;i++){
- for (int j=0;j<Games;j++){
- char first=TheFirst(TheGameBoard[j]);
- int FirstRank =CheckWhatPlace(first,i);
- char second=TheSecond(TheGameBoard[j]);
- int SecondRank =CheckWhatPlace(second,i);
- double odd=TheOdd(first,FirstRank,second,SecondRank);
- TheMultyBoard[i][j]=(int) (firstodd*secondodd);
- TheMainBoard [i][j]=(int) (firstodd*secondodd);
- TheODDBoard[i][j]=odd;
- }
- }
- }
- public static double TheOdd(char firstplace ,int FirstRating ,char secondplace, int SecondRating){
- int first=(int)firstplace-48;
- int second=(int)secondplace-48;
- firstodd=TheRankingBoard[FirstRating-1][first-1];
- secondodd=TheRankingBoard[SecondRating-1][second-1];
- double thesum=firstodd-secondodd;
- if(thesum<0){
- thesum=thesum*-1;
- double TheODD=1/(2+(thesum));
- return TheODD;
- }
- double TheODD=1/(2+(thesum));
- return 1-TheODD;
- }
- static int CheckWhatPlace(char f,int row) {
- int place=0;
- int i=0;
- for (i=0;i<Players;i++){
- if(f==TheRankBoard[row][i].charAt(0)) place=i+1;
- }
- return place;
- }
- public static char TheFirst(String game){
- char Thefirst=game.charAt(0);
- return Thefirst;
- }
- public static char TheSecond(String game){
- char TheSec=game.charAt(1);
- return TheSec;
- }
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement