zoukankan      html  css  js  c++  java
  • java实现第三届蓝桥杯排日程

    排日程

    【编程题】(满分34分)

    某保密单位机要人员 A,B,C,D,E 每周需要工作5天,休息2天。

    上级要求每个人每周的工作日和休息日安排必须是固定的,不能在周间变更。

    此外,由于工作需要,还有如下要求:

    1. 所有人的连续工作日不能多于3天(注意:周日连到下周一也是连续)。

    2. 一周中,至少有3天所有人都是上班的。

    3. 任何一天,必须保证 A B C D 中至少有2人上班。

    4. B D E 在周日那天必须休息。

    5. A E 周三必须上班。

    6. A C 一周中必须至少有4天能见面(即同时上班)。

    你的任务是:编写程序,列出ABCDE所有可能的一周排班情况。工作日记为1,休息日记为0
    A B C D E 每人占用1行记录,从星期一开始。

    【输入、输出格式要求】

    程序没有输入,要求输出所有可能的方案。
    每个方案是7x5的矩阵。只有1和0组成。
    矩阵中的列表示星期几,从星期一开始。
    矩阵的行分别表示A,B,C,D,E的作息时间表。
    多个矩阵间用空行分隔开。

    例如,如下的矩阵就是一个合格的解。请编程输出所有解(多个解的前后顺序不重要)。

        0110111
        1101110
        0110111
        1101110
        1110110
    

    【注意】

    请仔细调试!您的程序只有能运行出正确结果的时候才有机会得分!

    请把所有类写在同一个文件中,调试好后,存入与【考生文件夹】下对应题号的“解答.txt”中即可。

    相关的工程文件不要拷入。

    请不要使用package语句。

    源程序中只能出现JDK1.5中允许的语法或调用。不能使用1.6或更高版本。

    import java.util.ArrayList;
    
    
    public class Main {
        public static int[] S = {0, 1};
        public static ArrayList<String> list = new ArrayList<String>();
        public static ArrayList<String> result = new ArrayList<String>();
        
        public boolean check(int[] A) {
            int count = 0;
            for(int i = 0;i < 7;i++) {
                if(A[i] == 1)
                    count++;
                if(A[i % 7] == 1 && A[(i+1) % 7] == 1 && A[(i+2) % 7] == 1
                        && A[(i+3) % 7] == 1)
                    return false;
            }
            if(count == 5)
                return true;
            return false;
        }
        
        public void dfs(int[] A, int step) {
            if(step == A.length) {
                if(check(A)) {
                    StringBuilder s = new StringBuilder("");
                    for(int i = 0;i < A.length;i++)
                        s.append(A[i]);
                    if(!list.contains(s))
                        list.add(s.toString());
                }
                return;
            } else {
                for(int i = 0;i < 2;i++) {
                    A[step] = S[i];
                    dfs(A, step + 1);
                    A[step] = -1;
                }
            }
        }
        
        public boolean check1(String[] arrayA, int step) {
            if(step >= 0) {
                if(arrayA[0].charAt(2) != '1')
                    return false;
            }
            if(step >= 1) {
                if(arrayA[1].charAt(6) != '0')
                    return false;
            }
            if(step >= 2) {
                int count = 0;
                for(int i = 0;i < arrayA[0].length();i++) {
                    if(arrayA[0].charAt(i) == arrayA[2].charAt(i) &&
                            arrayA[0].charAt(i) == '1')
                        count++;
                }
                if(count < 4)
                    return false;
            }
            if(step >= 3) {
                if(arrayA[3].charAt(6) != '0')
                    return false;
                for(int i = 0;i < arrayA[0].length();i++) {
                    int count = 0;
                    if(arrayA[0].charAt(i) == '1')
                        count++;
                    if(arrayA[1].charAt(i) == '1')
                        count++;
                    if(arrayA[2].charAt(i) == '1')
                        count++;
                    if(arrayA[3].charAt(i) == '1')
                        count++;
                    if(count < 2)
                        return false;
                }
            }
            if(step >= 4) {
                if(arrayA[4].charAt(6) != '0' || arrayA[4].charAt(2) != '1')
                    return false;
                int count = 0;
                for(int i = 0;i < arrayA[0].length();i++) {
                    if(arrayA[0].charAt(i) == '1' && arrayA[1].charAt(i) 
                            == '1' && arrayA[2].charAt(i) == '1' && 
                            arrayA[3].charAt(i) == '1' && arrayA[4].charAt(i) == '1')
                        count++;
                }
                if(count < 3)
                    return false;
            }
            return true;
        }
        
        public void dfsResult(String[] arrayA, int step) {
            if(step == 5) {
                String s = "";
                for(int i = 0;i < arrayA.length;i++) {
                    s = s + arrayA[i] + "
    ";
                }
                if(!result.contains(s))
                    result.add(s);
                return;
            } else {
                for(int i = 0;i < list.size();i++) {
                    arrayA[step] = list.get(i);
                    if(check1(arrayA, step)) {
                        dfsResult(arrayA, step + 1);
                        arrayA[step] = "";
                    } else {
                        continue;
                    }
                }
            }
        }
        
        public void getResult() {
            int[] A = {-1,-1,-1,-1,-1,-1,-1};
            dfs(A, 0);
            String[] arrayA = new String[5];
            dfsResult(arrayA, 0);
            
            for(int i = 0;i < result.size();i++)
                System.out.println(result.get(i));
        }
        
        public static void main(String[] args) {
            Main test = new Main();
            test.getResult();
            
        }
    }
    
  • 相关阅读:
    POJ 3276 Face The Right Way
    POJ 3061 Subsequence
    HDU 2104 hide handkerchief
    GCJ Crazy Rows
    HDU 1242 Rescue
    激光炸弹:二维前缀和
    I Hate It:线段树:单点修改+区间查询
    承压计算:模拟+double
    等差素数列:线性筛+枚举
    Period :KMP
  • 原文地址:https://www.cnblogs.com/a1439775520/p/13077131.html
Copyright © 2011-2022 走看看