| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 679 人关注过本帖
标题:一个逻辑编程问题解决不了,大家帮帮忙
只看楼主 加入收藏
gd6570
Rank: 1
等 级:新手上路
帖 子:18
专家分:0
注 册:2013-7-22
结帖率:25%
收藏
已结贴  问题点数:1 回复次数:8 
一个逻辑编程问题解决不了,大家帮帮忙
我国有四大淡水湖。
A说:洞庭湖最大,洪泽湖最小,潘阳湖第三。
B说:洪泽湖最大,洞庭湖最小,潘阳湖第二,太湖第三。
C说:洪泽湖最小,洞庭湖第三。
D说:潘阳湖最大,太湖最小,洪泽湖第二,洞庭湖第三。
4个人每个人仅答对了一个,请编程给出4个湖从大到小的顺序。
搜索更多相关主题的帖子: 洞庭湖 洪泽湖 淡水湖 太湖 
2014-03-17 23:34
gd6570
Rank: 1
等 级:新手上路
帖 子:18
专家分:0
注 册:2013-7-22
收藏
得分:0 
有木有人那?
2014-03-18 17:36
lixinyuan224
Rank: 2
等 级:论坛游民
帖 子:28
专家分:28
注 册:2010-7-25
收藏
得分:1 
d:洞庭 h:洪湖 p:鄱阳 t:太
数据结构:
    A: d1 h4 p3
    B: d4 h1 p2 t3
    C: d3 h4
    D: d3 h2 p1 t4

一种可能结果:
    A:    h4
    B:          t3
    C:    h4
    D:       p1

和八皇后差不多,从上往下,从左到右假设为真,检验同一列不同元素删除,同一行其它元素与其他所有元素相同的删除。
递归进行。
2014-03-18 21:47
wly2014
Rank: 2
等 级:论坛游民
帖 子:29
专家分:19
注 册:2014-2-25
收藏
得分:1 
2014-03-19 16:11
gd6570
Rank: 1
等 级:新手上路
帖 子:18
专家分:0
注 册:2013-7-22
收藏
得分:0 
回复 3楼 lixinyuan224
可不可以给一个代码?拜托了!
2014-03-22 19:23
日知己所无
Rank: 11Rank: 11Rank: 11Rank: 11
等 级:贵宾
威 望:38
帖 子:427
专家分:2071
注 册:2014-3-22
收藏
得分:1 
程序代码:
public class FourLargestFreshwaterLake {

    public static void main(String[] args) {
        for (int d = 1; d <= 4; d++) { // "洞庭湖"
            for (int h = 1; h <= 4; h++) { // "洪泽湖"
                for (int b = 1; b <= 4; b++) { // "潘阳湖"
                    for (int t = 1; t <= 4; t++) { // "太湖"
                        if (meetAllConditions(d, h, b, t)) {
                            String[] fourLake = new String[5];
                            fourLake[d] = "洞庭湖";
                            fourLake[h] = "洪泽湖";
                            fourLake[b] = "潘阳湖";
                            fourLake[t] = "太湖";
                            for (String lake : fourLake) {
                                if (lake != null && lake.length() > 0) {
                                    System.out.println(lake);
                                }
                            }
                        }
                    }
                }
            }
        }
    }

    private static boolean meetAllConditions(int d, int h, int b, int t) {
        if (d == h || d == b || d == t
         || h == b || h == t || b == t) {
            return false;
        }

        if (!meetACondition(d, h, b, t, 0)) { return false; }
        if (!meetBCondition(d, h, b, t, 0)) { return false; }
        if (!meetCCondition(d, h, b, t, 0)) { return false; }
        if (!meetDCondition(d, h, b, t, 0)) { return false; }

        return true;
    }

    private static boolean meetACondition(int d, int h, int b, int t, int meetTimes) {
        if (d == 1) { meetTimes++; } // 洞庭湖最大
        if (h == 4) { meetTimes++; } // 洪泽湖最小
        if (b == 3) { meetTimes++; } // 潘阳湖第三
        return (meetTimes == 1); // 每个人仅答对了一个
    }

    private static boolean meetBCondition(int d, int h, int b, int t, int meetTimes) {
        if (h == 1) { meetTimes++; } // 洪泽湖最大
        if (d == 4) { meetTimes++; } // 洞庭湖最小
        if (b == 2) { meetTimes++; } // 潘阳湖第二
        if (t == 3) { meetTimes++; } // 太湖第三
        return (meetTimes == 1); // 每个人仅答对了一个
    }

    private static boolean meetCCondition(int d, int h, int b, int t, int meetTimes) {
        if (d == 3) { meetTimes++; } // 洪泽湖最小
        if (h == 4) { meetTimes++; } // 洞庭湖第三
        return (meetTimes == 1); // 每个人仅答对了一个
    }

    private static boolean meetDCondition(int d, int h, int b, int t, int meetTimes) {
        if (b == 1) { meetTimes++; } // 潘阳湖最大
        if (t == 4) { meetTimes++; } // 太湖最小
        if (h == 2) { meetTimes++; } // 洪泽湖第二
        if (d == 3) { meetTimes++; } // 洞庭湖第三
        return (meetTimes == 1); // 每个人仅答对了一个
    }
}


输出:
潘阳湖
洞庭湖
太湖
洪泽湖
2014-03-22 22:14
gd6570
Rank: 1
等 级:新手上路
帖 子:18
专家分:0
注 册:2013-7-22
收藏
得分:0 
回复 6楼 日知己所无
写的代码还蛮长的,感觉还不错,有一个for循环没看懂,帮忙解答一下?
 for (String lake : fourLake) {
                                if (lake != null && lake.length() > 0) {
                                    System.out.println(lake);
                                }

for语句后面的括号里面的东西不知道还可以这样用?帮忙解答一下谢谢了、
2014-03-27 14:49
日知己所无
Rank: 11Rank: 11Rank: 11Rank: 11
等 级:贵宾
威 望:38
帖 子:427
专家分:2071
注 册:2014-3-22
收藏
得分:0 
回复 7楼 gd6570
这里用了一个“小技巧”

本来有四个湖
定义数组时最好定义下标为0至3,大小正好是4的数组

但是由于数组下标从0开始
所以在对应某某湖为第三大湖时,会在编代码时带来麻烦
因为这个时候第“三”大湖的下标为“2”,理解起来很困难

为了解决上面的问题
定义数组0至4,使用其中的1至4来对应4个湖

这时引入了一个新问题,就是浪费掉的那个数组0,
由于未使用,一直是空(null)的,如果不做判断会抛异常

结论:最好在自己的代码的前面都加上非空判断和length、size大于0的判断
2014-03-27 19:54
gd6570
Rank: 1
等 级:新手上路
帖 子:18
专家分:0
注 册:2013-7-22
收藏
得分:0 
回复 8楼 日知己所无
能不能留个QQ,或者加我QQ718879459啊,关于FOR语句的这个语法我不太熟悉
2014-03-28 13:37
快速回复:一个逻辑编程问题解决不了,大家帮帮忙
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.042079 second(s), 7 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved