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

评论