【C语言编程练习】新娘与新郎

1. 题目要求

新郎A,B,C与新娘 X,Y,Z。有人不知道她们谁和谁结婚了,询问了6位新人中的三位,A说他将和X结婚,X说她的未婚夫是C,C说她会和Z结婚,一听就知道是全是假话,请编程找出谁和谁结婚

2. 题目分析

what!这是什么情况!这是什么混乱的关系。才看完问题之后发现没有什么线索呢?只有一句全是假话,所以上述的关系就可以作为排除,还是用穷举法,然后排除上面的情况。

所以,目前我的思路是,没有看参考答案的思路就是先列出所有可能情况,然后再对条件排除。

3. 代码尝试

【难点】如何表示解空间?有没有什么方法呢?

for(i=0;i<3;i++){

        for(j=0;j<3;j++){

            for(k=0;k<3;k++){

                if(i!=k&&j!=k&&i!=j){ //判断不是同一个新郎

                    

                }

            }

        }

}

 

【难点】如何表示排除关系呢?

  if(wife[i] == 'X') return 0;其实这句话的意思就是:i对应的一定不是‘X’,一定要好好体会呢!

【代码1】

#include <stdio.h>

int isMatch(int i,int j,int k , char wife[]){

    if(wife[i] == 'X') return 0;

    if(wife[j] == 'Y') return 0;

    if(wife[k] == 'Z') return 0;

    return 1;

}

int main(){

    char hansband[3]={'A','B','C'};

    char wife[3]={'X','Y','Z'};

    int i,j,k;

 

    for(i=0;i<3;i++){

        for(j=0;j<3;j++){

            for(k=0;k<3;k++){

                if(i!=k&&j!=k&&i!=j){ //判断不是同一个新郎

                    if(isMatch(i,j,k,wife)){

                            printf("husband  wife\n");

                            printf("A ---- %c\n",wife[i]);

                            printf("B ---- %c\n",wife[j]);

                            printf("C ---- %c\n",wife[k]);

                    }

                }

            }

        }

    }

 

 

    return 0;

}

 

可以看出结果是有问题的呢!

 

错误原因:

一点点小小的成就就冲昏了头脑呢,约束条件也太相当让了吧~

 

#include <stdio.h>

int Match(int i,int j,int k , char wife[]){

    if(wife[i] == 'X') return 0; X与A不会结婚

    if(wife[k] == 'X') return 0; X与C不会结婚

    if(wife[k] == 'Z') return 0; Z与C不会结婚

    return 1;

}

int main(){

    char hansband[3]={'A','B','C'};

    char wife[3]={'X','Y','Z'};

    int i,j,k;

 

    for(i=0;i<3;i++){

        for(j=0;j<3;j++){

            for(k=0;k<3;k++){

                if(i!=k&&j!=k&&i!=j){ //判断不是同一个新郎

                    if(Match(i,j,k,wife)){

                        printf("husband  wife\n");

                        printf("A ---- %c\n",wife[i]);

                        printf("B ---- %c\n",wife[j]);

                        printf("C ---- %c\n",wife[k]);

                    }

                }

            }

        }

    }

 

 

    return 0;

}

 

 

 

4. 总结

这个问题看似复杂,只要开始想一想,其实也是有思路可以找到的,其实这道题是前两天因为其他事情耽搁了,本来应该早一点就写好的。也是从解空间中找出符合问题条件的解,但需要注意的是对约束条件不能像当然呢,一定要想清楚!!

猜你喜欢

转载自www.cnblogs.com/mumutoday/p/10539281.html
今日推荐