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
正文
2005年8月22日第33期电脑报编程点将2005-09-09 23:54:00
【评论】 【打印】 【字体:大 中 小】 本文链接:http://blog.pfan.cn/xiangyu/4576.html
阅读(4839) | 评论(1)
版权声明:编程爱好者网站为此博客服务提供商,如本文牵涉到版权问题,编程爱好者网站不承担相关责任,如有版权问题请直接与本文作者联系解决。谢谢!
评论