11
回答
Java高手请进,求解 ABCDE五名学生参加竞赛
百度AI开发者大赛带你边学边开发,赢100万奖金,加群:418589053   
 1、A参加时,B也参加;

   2、B和C只有一个人参加;

   3、C和D或者都参加,或者都不参加;

   4、D和E中至少有一个人参加;

   5、如果E参加,那么A和D也都参加。

想了半天都找不到辙,小弟先谢谢各位大侠了!!
举报
xnu!7
发帖于6年前 11回/960阅
共有11个答案 最后回答: 6年前
我的猜测有以下几种情况:对于A和B有三种情况:AB都参加(C和D不参加,E必须参加,则A和D也要参加,矛盾); AB都不参加(CD都参加,E不参加);A不参加B参加(CD都不参加,E必须参加,A和D也要参加,矛盾)。

CD参加,ABE不参加。

解释:

推论1.如果A参加,B也参加(条件1),则C不参加(条件2),所以D也不参加(条件3),则E肯定参加(条件4),则A,D必须参加(条件5),与之前的结论矛盾。

推论2.所以A不参加,则B不知道是否参加,根据推论1,则判定B应该不参加,则C参加(条件2),所以D参加(条件3),则E不知道是否参加,如果E参加,则A,D要参加,矛盾所以,E不参加。

好吧,我还真是不太想动脑子...写了一个

import java.util.*;

/**
 *
 * @author  Jeky
 */
public class DeduceEngine {

    public DeduceEngine() {
        rules = new LinkedList<Rule>();
    }

    public void addRule(Rule rule) {
        rules.add(rule);
    }

    public boolean accept(Object[] initState) {
        for (Rule r : rules) {
            if (!r.accept(initState)) {
                return false;
            }
        }
        return true;
    }

    public static interface Rule {

        boolean accept(Object[] state);
    }

    public static enum State {

        ATTEND, NOT_ATTEND
    }

    public static void main(String[] args) {
        int PERSON_COUNT = 5;
        //init rules
        DeduceEngine engine = new DeduceEngine();
        engine.addRule(new Rule() {

            @Override
            public boolean accept(Object[] state) {
                //A参加时,B也参加
                if (state[0] == State.ATTEND) {
                    return state[1] == State.ATTEND;
                }
                return true;
            }
        });
        engine.addRule(new Rule() {

            @Override
            public boolean accept(Object[] state) {
                //B和C只有一个人参加
                return state[1] != state[2];
            }
        });
        engine.addRule(new Rule() {

            @Override
            public boolean accept(Object[] state) {
                //C和D或者都参加,或者都不参加
                return state[2] == state[3];
            }
        });
        engine.addRule(new Rule() {

            @Override
            public boolean accept(Object[] state) {
                //D和E中至少有一个人参加
                return state[3] == State.ATTEND || state[4] == State.ATTEND;
            }
        });
        engine.addRule(new Rule() {

            @Override
            public boolean accept(Object[] state) {
                //如果E参加,那么A和D也都参加
                if (state[4] == State.ATTEND) {
                    return (state[0] == State.ATTEND)
                           && (state[3] == State.ATTEND);
                }
                return true;
            }
        });

        //check every state:
        int total = (int) Math.pow(2, PERSON_COUNT);
        for (int i = 0; i < total; i++) {
            State[] curState = new State[PERSON_COUNT];
            int curStateNum = i;
            for (int j = PERSON_COUNT - 1; j >= 0; j--) {
                curState[j] = (curStateNum & 1) == 1 ? State.ATTEND : State.NOT_ATTEND;
                curStateNum = curStateNum >> 1;
            }
            if(engine.accept(curState)){
                System.out.println(Arrays.toString(curState));
            }
        }
    }
    private List<Rule> rules;
}

结果:

[NOT_ATTEND, NOT_ATTEND, ATTEND, ATTEND, NOT_ATTEND]

即CD参加,ABE不参加...我真无聊....

--- 共有 2 条评论 ---
Jeky回复 @中山野鬼 : 算了吧...就女朋友已经够我忙的了 6年前 回复
中山野鬼教你个方法,到招聘版,看见女猎头就发消息,联络,如果是本市单身的,约出来续续,就不无聊了。哈。 6年前 回复
/**
 * @function 	
 * 1、A参加时,B也参加;
 * 2、B和C只有一个人参加;
 * 3、C和D或者都参加,或者都不参加;
 * 4、D和E中至少有一个人参加;
 * 5、如果E参加,那么A和D也都参加。
 * @author  Zhao.G.CH
 * @date 2012.04.21
 */

public class TestX {
	public static void main(String[] args) {
		
		int[] arr = new int[5];
		evaluation(arr,0);
		System.exit(0);
	}

	//A B C D E 
	//0  1 2 3 4  
	public static boolean judge(int[] arr) {
		boolean t1 = arr[0] == 0 || arr[1] == 1;
		boolean t2 = arr[1] + arr[2] <= 1;
		boolean t3 = (arr[2] + arr[3] == 0) || (arr[2] + arr[3] == 2);
		boolean t4 = arr[3] + arr[4] >= 1;
		boolean t5 = arr[4] == 0 || arr[0] + arr[3] == 2;
		
		return t1 && t2 && t3 && t4 && t5;
	}
	
        //递归遍历所有情况
	public static void evaluation(int[] arr,int n) {
		
		if(n >= arr.length) {
			if(judge(arr))
				display(arr);
			return;
		}
		
		arr[n] = 0;
		evaluation(arr,n+1);
		arr[n] = 1;
		evaluation(arr,n+1);
	}
	
	public static void display(int[] arr) {
		for(int i = 0; i < arr.length; i++) {
			if(arr[i] > 0)
				System.out.print(" " + (char)(i + 'A'));
		}
		System.out.println();
	}
}

结果是C D参加,其他不参加。
顶部