正文

2005年8月22日第33期电脑报编程点将2005-09-09 23:54:00

【评论】 【打印】 【字体: 】 本文链接:http://blog.pfan.cn/xiangyu/4576.html

分享到:

2005年8月22日第33期电脑报编程点将
题目:某侦察队接到一项紧急任务,要求在A,B,C,D,E,F六个队员中尽可能多挑若干个人去完成任务,但有以下限制条件:
(1)A和B两人中至少去一个;
(2)A和D不能一起去;
(3)A、E和F三人中要派两个人去;
(4)B和C都去或者都不去;
(5)C和D两人中去一个;
(6)若D不去,则E也不去。
请用程序求出应该让哪几个人去?

我的分析和程序:

/*用整数a,b,c,d,e,f来表示这六个人去或者不去,值为0代表不去,值为1代表去。用循环让这六个数可以取遍0和1,
当满足题目所要求的条件就显示出来,题目中的条件可以通过下面的来判断:
(a||b)==1//条件(1)
&&(a&&d)==0//条件(2)
&&(((a&&e)==1&&f==0)||((a&&f)==1&&e==0)||((e&&f)==1&&a==0))//条件(3)
&&(b==c)//条件(4)
&&(c!=d)//条件(5)
&&(e<=d))//条件(6)
*/

初步程序:————这里没有考虑题目中的:尽可能多挑选若干个人去。也就是人应该尽量多
该程序在VC++6.0通过运行,结果:可以叫下面的人去:A  B  C  F

#include<iostream>
using namespace std;
int AA[6];
char BB[]={'A','B','C','D','E','F'};
void main()
{
    int &a=AA[0],&b=AA[1],&c=AA[2],&d=AA[3],&e=AA[4],&f=AA[5];
    int i;
    for(a=0;a<2;a++)
        for(b=0;b<2;b++)
            for(c=0;c<2;c++)
                for(d=0;d<2;d++)
                    for(e=0;e<2;e++)
                        for(f=0;f<2;f++)
                            if((a||b)==1&&(a&&d)==0&&
                                (((a&&e)==1&&f==0)||((a&&f)==1&&e==0)||((e&&f)==1&&a==0))
                                &&(b==c)&&(c!=d)&&(e<=d))
                            {
                                cout<<"可以叫下面的人去:";
                                for(i=0;i<6;i++)
                                    if(AA[i]==1)cout<<BB[i]<<"  ";
                                cout<<endl;
                            }
}

由上面的程序我们可以看出其实只有一种派选的可能,但是我们还是尽量来完善程序。
在下面这个程序中,我们把目前满足条件的最多的人暂时保存在CC[]数组里面,当遇到可以满足条件并且比现在具有更多人时我们
就更新CC[]数组。

#include<iostream>
using namespace std;
int AA[6];
char BB[]={'A','B','C','D','E','F'};
char CC[6];
void main()
{
    int &a=AA[0],&b=AA[1],&c=AA[2],&d=AA[3],&e=AA[4],&f=AA[5];
    int i,j,temp=0;
    for(a=0;a<2;a++)
        for(b=0;b<2;b++)
            for(c=0;c<2;c++)
                for(d=0;d<2;d++)
                    for(e=0;e<2;e++)
                        for(f=0;f<2;f++)
                            if((a||b)==1&&(a&&d)==0&&
                                (((a&&e)==1&&f==0)||((a&&f)==1&&e==0)||((e&&f)==1&&a==0))
                                &&(b==c)&&(c!=d)&&(e<=d))
                            {
                                for(i=0,j=0;i<6;i++)
                                    if(AA[i]==1)j++;
                                if(temp<j)
                                {
                                    temp=j;
                                    for(i=0,j=0;i<6;i++)
                                        if(AA[i]==1)CC[j++]=BB[i];
                                    CC[j]='\0';
                                }
                            }
    cout<<"可以叫下面的人去:";
    for(i=0;CC[i];i++)
        cout<<CC[i]<<"  ";
    cout<<endl;
}

看完获奖程序后,我得到人家的一些条件的控制比我好(编程的基本思想和我相同),如下:
(3)A、E和F三人中要派两个人去;:a+e+f==2;

获奖程序因字数限制没有帖出来,其下载地址是:
www.cpcw.com/xz/33huojiang.rar

阅读(4687) | 评论(1)


版权声明:编程爱好者网站为此博客服务提供商,如本文牵涉到版权问题,编程爱好者网站不承担相关责任,如有版权问题请直接与本文作者联系解决。谢谢!

评论

loading...
您需要登录后才能评论,请 登录 或者 注册