• 算法笔记_153:算法提高 判断名次(Java)


    目录

    1 问题描述

    2 解决方案

     


    1 问题描述

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

    2 解决方案

    具体代码如下:

    import java.util.ArrayList;
    import java.util.Collections;
    import java.util.Scanner;
    
    public class Main {
        public static String[] say = new String[5];
        public static ArrayList<String> temp = new ArrayList<String>();
        public static ArrayList<String> result = new ArrayList<String>();
        
        public void swap(char[] A, int i, int j) {
            char s = A[i];
            A[i] = A[j];
            A[j] = s;
        }
        
        public void dfs(char[] A, int step) {
            if(step == A.length) {
                StringBuilder s = new StringBuilder("");
                for(int i = 0;i < A.length;i++)
                    s.append(A[i]);
                temp.add(s.toString());
            } else {
                for(int i = step;i < A.length;i++) {
                    swap(A, i, step);
                    dfs(A, step + 1);
                    swap(A, i, step);
                }
            }
        }
        
        public boolean judge(int a, String o, int p, int b) {
            if(b == 1) {  //此次说话为真
                if(o.equals(">")) {
                    if(a > p)
                        return true;
                    else
                        return false;
                } else if(o.equals(">=")) {
                    if(a >= p)
                        return true;
                    else
                        return false;
                } else if(o.equals("=")) {
                    if(a == p)
                        return true;
                    else
                        return false;
                } else if(o.equals("!=")) {
                    if(a != p)
                        return true;
                    else
                        return false;
                } else if(o.equals("<")) {
                    if(a < p)
                        return true;
                    else
                        return false;
                } else if(o.equals("<=")) {
                    if(a <= p)
                        return true;
                    else
                        return false;
                }
            } else if(b == 0) {  //此次说话为假
                if(o.equals(">")) {
                    if(a <= p)
                        return true;
                    else
                        return false;
                } else if(o.equals(">=")) {
                    if(a < p)
                        return true;
                    else
                        return false;
                } else if(o.equals("=")) {
                    if(a != p)
                        return true;
                    else
                        return false;
                } else if(o.equals("!=")) {
                    if(a == p)
                        return true;
                    else
                        return false;
                } else if(o.equals("<")) {
                    if(a >= p)
                        return true;
                    else
                        return false;
                } else if(o.equals("<=")) {
                    if(a > p)
                        return true;
                    else
                        return false;
                }
            }
            return false;
        }
        
        public void getResult(int i, int j) {
            for(int t = 0;t < temp.size();t++) {
                String s = temp.get(t);
                boolean judge1 = true;
                for(int m = 0;m < 5;m++) {
                    char a = say[m].charAt(0);
                    String o = "";
                    int p = say[m].charAt(say[m].length() - 1) - '0';
                    if(say[m].length() == 3) {
                        o = o + say[m].substring(1, 2);
                    } else {
                        o = o + say[m].substring(1, 3);
                    }
                    if(i == m || j == m) {
                        judge1 = judge(s.indexOf(a) + 1, o, p, 1);
                    } else {
                        judge1 = judge(s.indexOf(a) + 1, o, p, 0);
                    }
                    if(judge1 == false)
                        break;
                }
                if(judge1 == false)
                    continue;
                int a1 = s.indexOf(('A'+i));
                int a2 = s.indexOf(('A'+j));
                if((a1 == 1 && a2 == 3) || (a1 == 3 && a2 == 1)) {
                    judge1 = true;
                } else {
                    judge1 = false;
                }
              
                if(judge1 == true) {
                    if(!result.contains(s))
                        result.add(s);
                }
            }
        }
        
        public static void main(String[] args) {
            Main test = new Main();
            String A = "ABCDE";
            char[] B = A.toCharArray();
            test.dfs(B, 0);
            Scanner in = new Scanner(System.in);
            for(int i = 0;i < 5;i++)
                say[i] = in.next();
            for(int i = 0;i < 5;i++) {
                for(int j = i + 1;j < 5;j++)
                    test.getResult(i, j);
            }
            Collections.sort(result);
            for(int i = 0;i < result.size();i++)
                System.out.println(result.get(i));
            System.out.println(result.size());
        }
    }
  • 相关阅读:
    【转】一步一步带你反编译apk,并教你修改smali和重新打包
    【转】安卓apk反编译、修改、重新打包、签名全过程
    【转】iOS安全之RSA加密/生成公钥、秘钥 pem文件
    Tomcat修改用户名密码教程
    docker安装使用教程(Kali2.0)
    WebSphere静默安装教程(WAS6.1为例)
    大学计算机书藉推荐(信息安全方向)
    计算机行业各种职业技能树
    APK骨架分析
    dvwa安装、配置、使用教程(Linux)
  • 原文地址:https://www.cnblogs.com/liuzhen1995/p/6784690.html
Copyright © 2020-2023  润新知