这两天写C语言代码遇到这个离散题,感觉还是蛮经典的,自己总结一下。
</pre><p>编写程序,解决下述问题:已知有A、B、 C、D、E、F共6人参加程序竞赛。其中:</p> A和B中至少一人获奖; A、C、D中至少二人获奖; A、E中至多一人获奖; B和F或者同时获奖,或者都未获奖; C和E的获奖情况也相同; 如果E未获奖,则F也不可能获奖; C、D、E、F中至多3人获奖。<p>请问那些人获了奖?</p><p>每个人有两种状态,获奖或者不获奖,用0/1标示两种状态,1表示中奖,0标示没中奖。</p><p>用check()函数实现对离散逻辑的判断。</p><p></p><pre name="code" class="cpp"><pre name="code" class="cpp">#include<stdio.h>
/*
*Function:判断参数数组是否满足离散条件
*auhtor:杨皓斐
*date:2015.5.9
*/
bool check(int nArray[])
{
int flag=0;
//AB都没有获奖
if((nArray[0]==0)&&(nArray[1]==0))
return false;
//A、C、D中至少二人获奖
if(nArray[0]==1)
flag++;
if(nArray[2]==1)
flag++;
if(nArray[3]==1)
flag++;
if(flag<2)
return false;
//A、E都获奖
if((nArray[0]==1)&&(nArray[4]==1))
return false;
//B、F获奖情况不相同
if(nArray[1]!=nArray[5])
return false;
//C、E获奖情况不相同
if(nArray[2]!=nArray[4])
return false;
//E未获奖,F获奖
if((nArray[4]==0)&&(nArray[5]==1))
return false;
//C、D、E、F中获奖人数大于3
flag=0;
if(nArray[2]==1)
flag++;
if(nArray[3]==1)
flag++;
if(nArray[4]==1)
flag++;
if(nArray[5]==1)
flag++;
if(flag>3)
return false;
//条件满足,返回true
return true;
}
int main()
{
int temp,nArray[6],i,j;
//六个元素,总共pow(2,6)种情况
for(int i = 0; i < 64; ++i){
int temp = i;
//利用temp临时变量,保证生成的64个数组不重复
for(int j = 0; j < 6; ++j){
nArray[j] = temp%2;
temp /= 2;
}
if(check(nArray))
{
printf("找到解\n");
for(j = 0;j < 6;j ++)
{
if(nArray[j]==1)
printf("%c获奖\n",'A'+j);
}
}
}
return 0;
}