zoukankan      html  css  js  c++  java
  • Java实现 蓝桥杯 算法提高 判断名次

    算法提高 判断名次
    时间限制:1.0s 内存限制:256.0MB
    问题描述
      某场比赛过后,你想要知道A~E五个人的排名是什么,于是要求他们每个人说了一句话。(经典的开头……-_-!)得了第1名的人23,说了假话;得了第5名的人不好意思,也说了假话;为了使求解问题简单,第3名同样说了假话。(奇数名次说假话)
    输入格式
      共5行,各行依次表示A~E说的话。
      每行包含一个形如“A>=3”的名次判断,即一个大写字母+关系运算符+一个数字,不包含空格。
      大写字母AE,关系运算<、<=、=、>=、>、!=,数字15。注意:等于是“=”不是“==”!
    输出格式
      可能有多解,请按照字典序输出排名序列,每个解一行
      最后一行输出解的数量
    样例输入
    A=2
    D=5
    E>3
    A>2
    B!=1
    样例输出
    ACDEB
    AECBD
    BADCE
    BCADE
    BDACE
    CEADB
    CEBDA
    7

    import java.util.ArrayList;
    import java.util.Collections;
    import java.util.Scanner;
    
    
    public class 判断名次 {
    	 private static String[] strArr=new String[5];
    	    private static ArrayList<String> list=new ArrayList<String>();
    	    /**
    	     * @param args
    	     */
    	    public static void main(String[] args) {
    	        // TODO Auto-generated method stub
    	        Scanner sc=new Scanner(System.in);
    	        for(int i=0;i<5;i++){
    	            strArr[i]=sc.next();
    	        }
    	        allSort(0,5,new char[]{'A','B','C','D','E'});
    	        Collections.sort(list);
    	        for(int i=0;i<list.size();i++){
    	            System.out.println(list.get(i));
    	        }
    	        System.out.println(list.size());
    	    }
    
    	    private static void allSort(int start,int end,char[] arr){
    	        if(start==end){
    	            String s=new String(arr);
    	            if(judge(s)){
    	                list.add(s);
    	            }
    	        }else{
    	            for(int i=start;i<end;i++){
    	                char temp=arr[start];
    	                arr[start]=arr[i];
    	                arr[i]=temp;
    
    	                allSort(start+1,end,arr);
    
    	                temp=arr[start];
    	                arr[start]=arr[i];
    	                arr[i]=temp;
    	            }
    	        }
    	    }
    
    	    private static boolean judge(String s){
    	        char num1=s.charAt(0);
    	        char num3=s.charAt(2);
    	        char num5=s.charAt(4);
    	        String[] temp=new String[5];
    	        for(int i=0;i<5;i++){
    	            temp[i]=strArr[i].substring(0);
    	        }
    	        reverse(num1,temp);
    	        reverse(num3,temp);
    	        reverse(num5,temp);
    
    	        if(check(s,temp)){
    	            return true;
    	        }else{
    	            return false;
    	        }
    
    	    }
    
    	    private static boolean check(String s, String[] temp) {
    	        for(int i=0;i<5;i++){
    	            String talk=temp[i];
    	            if(talk.length()==3){
    	                if(talk.charAt(1)=='<'){
    	                    int realNumIndex=s.indexOf(""+talk.charAt(0))+1;//num实际的名词
    	                    int assumeNumIndex=talk.charAt(talk.length()-1)-'0';//num推断出的名次范围
    	                    if(!(realNumIndex<assumeNumIndex)){
    	                        return false;
    	                    }
    	                }else if(talk.charAt(1)=='='){
    	                    int realNumIndex=s.indexOf(""+talk.charAt(0))+1;//num实际的名词
    	                    int assumeNumIndex=talk.charAt(talk.length()-1)-'0';//num推断出的名次范围
    	                    if(!(realNumIndex==assumeNumIndex)){
    	                        return false;
    	                    }
    	                }else{
    	                    int realNumIndex=s.indexOf(""+talk.charAt(0))+1;//num实际的名词
    	                    int assumeNumIndex=talk.charAt(talk.length()-1)-'0';//num推断出的名次范围
    	                    if(!(realNumIndex>assumeNumIndex)){
    	                        return false;
    	                    }
    	                }
    	            }else{
    	                if(talk.charAt(1)=='>'){
    	                    int realNumIndex=s.indexOf(""+talk.charAt(0))+1;//num实际的名词
    	                    int assumeNumIndex=talk.charAt(talk.length()-1)-'0';//num推断出的名次范围
    	                    if(!(realNumIndex>=assumeNumIndex)){
    	                        return false;
    	                    }
    	                }else if(talk.charAt(1)=='!'){
    	                    int realNumIndex=s.indexOf(""+talk.charAt(0))+1;//num实际的名词
    	                    int assumeNumIndex=talk.charAt(talk.length()-1)-'0';//num推断出的名次范围
    	                    if(!(realNumIndex!=assumeNumIndex)){
    	                        return false;
    	                    }
    	                }else{
    	                    int realNumIndex=s.indexOf(""+talk.charAt(0))+1;//num实际的名词
    	                    int assumeNumIndex=talk.charAt(talk.length()-1)-'0';//num推断出的名次范围
    	                    if(!(realNumIndex<=assumeNumIndex)){
    	                        return false;
    	                    }
    	                }
    	            }
    	        }
    	        return true;
    	    }
    
    	    private static void reverse(char num,String[] temp){//num代表说假话的人
    	        switch(num){
    	        case 'A':temp[0]=change(temp[0]);break;
    	        case 'B':temp[1]=change(temp[1]);break;
    	        case 'C':temp[2]=change(temp[2]);break;
    	        case 'D':temp[3]=change(temp[3]);break;
    	        case 'E':temp[4]=change(temp[4]);break;
    	        }
    	    }
    
    	    //<、<=、=、>=、>、!=
    	    private static String change(String s){
    	        if(s.length()==3){
    	            if(s.charAt(1)=='<'){
    	                s=s.replace("<",">=");
    	            }else if(s.charAt(1)=='='){
    	                s=s.replace("=","!=");
    	            }else{
    	                s=s.replace(">","<=");
    	            }
    	        }else{
    	            if(s.charAt(1)=='>'){
    	                s=s.replace(">=","<");
    	            }else if(s.charAt(1)=='!'){
    	                s=s.replace("!=","=");
    	            }else{
    	                s=s.replace("<=",">");
    	            }
    	        }
    	        return s;
    	    }
    
    
    }
    
    
  • 相关阅读:
    不务正业系列-浅谈《过气堡垒》,一个RTS玩家的视角
    [LeetCode] 54. Spiral Matrix
    [LeetCode] 40. Combination Sum II
    138. Copy List with Random Pointer
    310. Minimum Height Trees
    4. Median of Two Sorted Arrays
    153. Find Minimum in Rotated Sorted Array
    33. Search in Rotated Sorted Array
    35. Search Insert Position
    278. First Bad Version
  • 原文地址:https://www.cnblogs.com/a1439775520/p/12948715.html
Copyright © 2011-2022 走看看