日期:2014-05-20  浏览次数:20634 次

javaSE小程序
赵、钱、孙、李、周五人围着一张圆桌吃饭。饭后,周回忆说:
 * “吃饭时,赵坐在钱旁边,钱的左边是孙或李”;李回忆说:“钱坐在孙左边,我挨着孙坐”。
 * 结果他们一句也没有说对。请问,他们在怎样坐的?  
 *  
用代码怎么解决,给点算法思路

------解决方案--------------------
Java code

// 结果为:
// 赵 孙 周 钱 李 
// 钱 李 赵 孙 周 
// 孙 周 钱 李 赵 
// 李 赵 孙 周 钱 
// 周 钱 李 赵 孙 

    public static void main(String[] args) {
        //0-赵,1-钱,2-孙,3-李,4-周
        int[] people = new int[5];
        all_permutation(people, 0);
    }
    
    private static void all_permutation(int[] people, int level) {
        if(level==5) {
            boolean zhou_say = getConditionOne(people);
            boolean li_say = getConditionTwo(people);
            if(!zhou_say && !li_say){
                print(people);
            }
            return;
        }else {
            for(int i=0; i<5; i++) {
                boolean flag = true;
                for(int j=0; j<level; j++) {
                    if(people[j]==i) {
                        flag = false;
                        break;
                    }
                }
                if(flag == false) {
                    continue;
                }else {
                    people[level] = i;
                    all_permutation(people, level+1);
                }
            }
        }
        
    }
    
    //在人群中找到某个人坐的位置
    private static int find_people(int[] people, String name) {
        String[] names = {"赵", "钱", "孙", "李", "周"};
        int i, value;
        for(value=0; value<names.length; value++) {
            if(names[value].equals(name)) {
                break;
            }
        }
        for(i=0; i<people.length; i++) {
            if(people[i] == value) {
                break;
            }
        }
        return i;
    }
    
    //周回忆的条件
    private static boolean getConditionOne(int[] people) {
        int zhao_pos = find_people(people, "赵");
        int qian_pos = find_people(people, "钱");
        int sun_pos = find_people(people, "孙");
        int li_pos = find_people(people, "李");
        boolean flag = zhao_pos + 1 == qian_pos ||
                        zhao_pos - 1 == qian_pos ||
                        zhao_pos == 4 && qian_pos == 0 ||
                        zhao_pos == 0 && qian_pos == 4 ||
                        qian_pos - 1 == sun_pos ||
                        qian_pos == 0 && sun_pos == 4 ||
                        qian_pos - 1 == li_pos ||
                        qian_pos == 0 && li_pos == 4 ;
        return flag;
    }
    
    //李回忆说
    private static boolean getConditionTwo(int[] people) {
        int qian_pos = find_people(people, "钱");
        int sun_pos = find_people(people, "孙");
        int li_pos = find_people(people, "李");
        boolean flag = qian_pos == sun_pos - 1 ||
                        qian_pos == 4 && sun_pos == 0 ||
                        li_pos + 1 == sun_pos ||
                        li_pos - 1 == sun_pos ||
                        li_pos == 4 && sun_pos == 0 ||
                        li_pos == 0 && sun_pos == 4;
        return flag;
    }
    
    //打印找到的结果
    private static void print(int[] people) {
        String[] names = {"赵", "钱", "孙", "李", "周"};
        for(int i:people) {
            System.out.print(names[i]+" ");
        }
        System.out.println();
    }

------解决方案--------------------
厉害,佩服得五体投地