• 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;
    	    }
    
    
    }
    
    
  • 相关阅读:
    Java基础—ArrayList源码浅析
    Java基础——类加载机制
    Java基础——常用类之日期时间类
    Java基础——反射
    栈队列例题3:使用两个栈实现一个队列
    栈队列例题2:SetOfStack放盘子
    栈队列例题1:设置带最小值的栈
    链表例题6:检查链表中的数据是否回文
    队列的实现
    栈的实现
  • 原文地址:https://www.cnblogs.com/a1439775520/p/12948714.html
Copyright © 2020-2023  润新知