解题思路:
注意事项:
参考代码:
#include<stdio.h>
int main()
{
int i=0,n[64],a,b,c,d,e,f,z=0;
//i是控制用的变量;n[]表示各种情况,数组长度取决于变量数量,为2的指数;a,b,c,d,e,f只是为了看起来方便.
//z是在不知道可能解数量的情况下,为了记录人数选出最优解设的变量.
while(i<=63)
{
n[i]=i;//i从0开始,数组依次放置0到63
a=(n[i]/32)%2;//如果i<=31,意味着n[i]/32=0(设的是整形),那么a一定为0;如果i>=32,那么n[i]/32一定是一点几,取1,意味着a一定为1
b=(n[i]/16)%2;//除数是16意味着求有几个16,对2求余得奇数或偶数.因为a有所不同,所以b相同时可能有多种情况
c=(n[i]/8)%2;//下方规则相同
d=(n[i]/4)%2;
e=(n[i]/2)%2;
f=n[i]%2;
if(a+b<1||a+d>1||a+e+f!=2||b+c==1||c+d!=1||e>d)//这是不满足要求的条件
{
n[i]=64;//不满足要求就让它为64,如果满足要求就保留原值(0-63)
}
else if(z<a+b+c+d+e+f)
{
z=a+b+c+d+e+f;//因为我们要求最优解,即人数最多的解,所以把人数记录下来,1是去,0是不去,和越大去的人越多.
}
else
{
n[i]=64;//如果后续的解不如之前的解,那就没必要留着了,但同时之前留着的不是最优解的解还在,这里偷懒一下,没把之前那些不是最优解的解去掉
}
i=i+1;
}
i=0;
while(i<=63)
{
if(n[i]!=64&&(n[i]/32)%2==1) printf("A,");//去一个输出一个
if(n[i]!=64&&(n[i]/16)%2==1) printf("B,");
if(n[i]!=64&&(n[i]/8)%2==1) printf("C,");
if(n[i]!=64&&(n[i]/4)%2==1) printf("D,");
if(n[i]!=64&&(n[i]/2)%2==1) printf("E,");
if(n[i]!=64&&n[i]%2==1) printf("F,");
if(n[i]!=64) printf("\n");//本题只有一个解,但如果有多个解可以换行输出
i=i+1;
}
return 0;
}
0.0分
0 人评分