算法--地点线路问题


算法--地铁线路问题

  因为不需要写实验报告,所以最后一点就不写了,差一个AA的问题,如果大神想要用的话可以补一下

  废话不说,上代码

import java.util.Scanner;

public class train {
    public static String[] one = {"A10", "A11", "A12", "A13", "A14", "A15", "A16", "A17", "A18", "A19", "A20", "A21", "A22", "A23", "A24", "A25", "A26"};
    public static String[] two = {"B1", "B2", "B3", "A12", "B4", "B5", "B6", "B7", "B8","B9", "B10", "A24", "B11", "B12", "B13", "B14"};
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        System.out.println("请输入开始站");
        String trainbegin = sc.next();
        System.out.println("请输入结束站");
        String trainend  = sc.next();
        train_fround_minload(trainbegin,trainend);
    }

    /**
     * 判断属于哪个类型,进行调用
     * 1.全部为A开头
     * 2.有A有B开头
     * 3.全部为B开头
     * 注:将AB和BB开头分开,可以增加代码可读性
     * @param trainbegin
     * @param trainend
     */
    public static void train_fround_minload(String trainbegin,String trainend){
        switch (analyse(trainbegin,trainend)){
            case "AA":AA(trainbegin,trainend); ;break;
            case "AB":AB(trainbegin,trainend);break;
            case "BB":BB(trainbegin,trainend); ;break;
            default:break;
        }
    }

    /**
     *
     * @param trainbegin  开始站次
     * @param trainend  结束站次
     */
    public static void AA(String trainbegin,String trainend){
        String[] as1 = trainbegin.split("A");
        String[] as2 = trainend.split("A");
        int be =Integer.parseInt(as1[1]);
        int en = Integer.parseInt(as2[1]);
        if (be < 10 || en > 26){
            System.out.println("err:请输入航班线内的站次!");
        }else {
            int len = en - be;
            System.out.println("一共走了" +Math.abs(len) + "站");
            System.out.println("分别是:");
            if (be == en ){
                System.out.println("请下车");
            }else{
                if (en > be){
                    for (int i = 0; i <= len; i++) {
                        System.out.print("A" + (be + i) + "  ");
                    }
                }else{
                    for (int i = 0; i <= Math.abs(len); i++) {
                        System.out.print("A" + (be - i) + "  ");
                    }
                }

            }

        }
    }
    public static void AB(String trainbegin,String trainend){
        //如果是A12或者A24的,就说明是BB的情况,调用BB
        if (trainbegin == "A12" || trainbegin == "A24" || trainend =="A12" ||trainend == "A24"){
            BB(trainbegin,trainend);
        }else{
            //首先运用拆分看第一个是否为A,因为其他情况都已经讨论过了,所以,只有AB或BA的两种情况
            int beone = printArray(one, trainbegin);
            int enone = printArray(one, trainend);
            int betwo = printArray(two, trainbegin);
            int entwo = printArray(two, trainend);
            String[] as1 = trainbegin.split("A");
            //情况--AB
            if (as1[1] == "A"){

            }
        }
    }

    /**
     * 全部以B开头的一定是走二号线,所以单独列出来,进行逻辑的判断,这个也可以有AB开头的进行调用
     * @param trainbegin
     * @param trainend
     */
    public static void BB(String trainbegin,String trainend){
        int be = printArray(two,trainbegin);
        int en = printArray(two,trainend);
        //将问题拆成下标大于8和小于8,分别对应的是按数组走和不按数组走
        if (Math.abs(en-be) <= 8 ){
            //如果en大于be就代表正向,小于代表逆向
            System.out.println("一共走了"+Math.abs(en-be)+"站");
            if (en > be){
                System.out.println("分别是:");
                for (int i = 0 ;i <= Math.abs(en-be);i++){
                    System.out.print(two[be+i]+"  ");
                }
            }else{
                System.out.println("分别是:");
                for (int i = 0 ;i <= Math.abs(en-be);i++){
                    System.out.print(two[be-i]+"  ");
                }
            }
        }else{
            int count = Math.abs(Math.abs(en - be)-16);
            System.out.println("一共走了"+count+"站");
            if (en > be){
                for (int i = 0 ;i <= count ; i++){
                    if (be - i >= 0) {
                        System.out.print(two[be - i]+"  ");
                    }
                    else{
                        System.out.print(two[16+be-i]+"  ");
                    }
                }
            }else{
                for (int i = 0 ;i <= count; i++){
                    if (be + i <= 15){
                        System.out.print(two[be+i]+"  ");
                    }else{
                        System.out.print(two[be+i-16]+"  ");
                    }
                }
            }


        }
    }

    /**
     *
     * @param trainbegin
     * @param trainend
     * @return 判断相对应的类型,为找到返回null
     */
    public static String analyse(String trainbegin,String trainend) {
        String sbegin = String.valueOf(trainbegin.charAt(0));
        String send = String.valueOf(trainbegin.charAt(0));
        if (sbegin.equals("A")  && send .equals("A")) {
            return "AA";
        } else if ((sbegin .equals("A") && send .equals("B")) || (sbegin .equals("B") && send .equals("A"))) {
            return "AB";
        } else if (sbegin .equals("B") && send.equals("B")) {
            return "BB";
        }
        return null;
    }

    /**
     *
     * @param array 要查找的数组
     * @param value 查找数组中的元素
     * @return 找到返回下标,未找到返回-1
     */
    public static int printArray(String[] array,String value){
        for(int i = 0;i){
            if(array[i].equals(value)){
                return i;
            }
        }
        return -1;//当if条件不成立时,默认返回一个负数值-1
    }

}