黑马程序员技术交流社区

标题: 算法求解解题思路????? [打印本页]

作者: 为梦想而活着    时间: 2014-4-10 17:47
标题: 算法求解解题思路?????
112.某高校外语教研室新招进五位外语老师,每位老师只教授一门外语。并且满足以下条件:

(1)如果小钱教德语,那么小孙不教俄语

(2)或者小李教德语,或者小钱教德语

(3)如果小孙不教俄语,那么小赵不教法语

(4)或者小赵教法语,或者小周不教英语。

以下选项如果为真,可以得出“小李教德语”的结论?

A.小孙不教俄语B、小钱教德语C、小周教英语D、小赵不教法语

作者: 赵小豪    时间: 2014-4-10 21:29
本帖最后由 赵小豪 于 2014-4-10 21:30 编辑

//4门语言5个人我不知道一门语言二个人教算不算,我在这是算成立的。这只是我的想法。如果有不同请再告诉我。
public class Text7 {
        public static void main(String[] args) {
                int zhao, qian, sun, li, zhou, i, j, k, flag;
                String str[] = { "英", "法", "德", "俄" };// 定义一个数组存储语言
                int arr[] = { 0, 0, 0, 0, 0 };// 初始一个数组代表5位老师用于存储他们对应所教的语言,

                // 1=英 2=法 3=德 4=俄 让每位老师不断的去循环,去测试看是否成立
                for (zhao = 1; zhao <= 4; zhao++) {
                        for (qian = 1; qian <= 4; qian++) {
                                for (sun = 1; sun <= 4; sun++) {
                                        for (li = 1; li <= 4; li++)
                                                for (zhou = 1; zhou <= 4; zhou++) {

                                                        flag = 1;
                                                        arr[0] = zhao;
                                                        arr[1] = qian;
                                                        arr[2] = sun;
                                                        arr[3] = li;
                                                        arr[4] = zhou;
                                                        
                                                        for (i = 1; i <= 4; i++) {
                                                                k = 0;
                                                                for (j = 0; j < 5; j++) {
                                                                        if (i == arr[j])
                                                                                k++;//计数
                                                                }
                                                                if (k == 0) {//有语言没有人教则退出
                                                                        flag = 0;
                                                                        break;
                                                                }
                                                        }

                                                        if (flag == 1)//一人教一门语言
                                                                if ((qian == 3 && sun != 4)//如果小钱教德语,那么小孙不教俄语
                                                                                || (li == 3 || qian == 3)//或者小李教德语,或者小钱教德语
                                                                                && (sun != 4 && zhao != 2)//如果小孙不教俄语,那么小赵不教法语
                                                                                || (zhao == 2 || zhou != 1)) //或者小赵教法语,或者小周不教英语。
                                                                        {
                                                                        //如果小李教德语则打印输出
                                                                        if (li == 3) {
                                                                                System.out.print(" 赵:" + str[zhao - 1]
                                                                                                + "\t");
                                                                                System.out.print("  钱:" + str[qian - 1]
                                                                                                + "\t");
                                                                                System.out.print("  孙:" + str[sun - 1]
                                                                                                + "\t");
                                                                                System.out.print("  李:" + str[li - 1]
                                                                                                + "\t");
                                                                                System.out.println(" 周:"        + str[zhou - 1] + "\t");
                                                                        }

                                                                }

                                                }
                                }
                        }

                }
        }
}
作者: 小歪    时间: 2014-4-10 22:04
解题思路:首先此题肯定是由“小李教德语”这个最终结果返回去寻找答案,但其中尤为重要是我们寻找的是必然会得到此结果的情况,因为可能存在当某个条件满足时有可能得到“小李教德语”,又有可能得到“小李不教德语”这种情况,此种情况必须避免。
1、由于以上4条条件都是成立的,即为真;
2、那么通过反推要使条件2中“小李教德语”必然为真,根据“或”语句的关系,则肯定其中有一个为假时另一个才能 100%为真的,所以得到“小钱不教德语”。可能有人会问小钱也有可能教德语条件2也为真啊,但是如果小钱教德语了反而得不到“小李教德语”这个必然结果,所以必须避免这种情况,如果还不明白,返回看我的解题思想第一段;
3、要使“小钱不教德语”也成为必然结果,则根据条件1的反推理只有“小孙教俄语”的情况下,小钱才必然不教法语,所以得到“小孙教俄语”。
4、同理,要使“小孙教俄语”也成为必然结果,则根据条件3的反推理只有“小赵教法语”的情况下,小孙才有可能教俄语,所以得到“小赵教法语”。
5、同理,“小赵教法语”必然为真的情况,条件4为“或”语句即一个为真(假)另一个才能得到必然假(真),所以要是“小赵教法语”必然为真,另一句必然就为假,得到”小周教英语“的必然条件。

所以答案为:C
(楼主分析了半天,要写成代码估计也得花点时间,在这我就不写了)
作者: 为梦想而活着    时间: 2014-4-11 18:35
这里是要用附言推理规则的




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2