回复 20楼 azzbcc
谢谢版主。。

一同学习, 一同进步
程序代码:#include <stdio.h>
const int vol[] = {0x37, 0x3b, 0x5b, 0x5d, 0x6d, 0x6e, 0x76};
int person[5] = {0};
int get(int result, int day)
{
return (result & (1 << (6 - day))) != 0;
}
int judge2()
{
int i, j, ans, res = 0;
for (i = 0;i < 7;++i)
{
ans = 0;
for (j = 0;j < 5;++j)
{
ans += get( person[j], i );
}
res += ans == 5;
}
return res >= 3;
}
int judge3()
{
int i, j, ans;
for (i = 0;i < 7;++i)
{
ans = 0;
for (j = 0;j < 4;++j)
{
ans += get( person[j], i );
}
if (ans < 2) return 0;
}
return 1;
}
int judge4()
{
return 0 == get( person[1], 6 ) + get( person[3], 6 ) + get( person[4], 6 );
}
int judge5()
{
return 2 == get( person[0], 2 ) + get( person[4], 2 );
}
int judge6()
{
int i, ans = 0;
for (i = 0;i < 7;++i)
{
ans += get( person[0], i ) && get( person[2], i );
}
return ans >= 4;
}
int judge()
{
return judge2() && judge3() && judge4() && judge5() && judge6();
}
void init(int tmp)
{
int i;
for (i = 0;i < 5;++i)
{
person[i] = vol[ tmp % 7 ];
tmp /= 7;
}
}
void Output()
{
int i, j;
for (i = 0;i < 5;++i)
{
for (j = 0;j < 7;++j)
{
printf("%d ", get( person[i], j) );
}
printf("\n");
}
printf("\n");
}
int main()
{
int i, all = 7 * 7 * 7 * 7 * 7;
for (i = 0;i < all;++i)
{
init(i);
if (judge())
Output();
}
return 0;
}

程序代码:#include<stdio.h>
int c0(int s) //某保密单位机构要人员 A B C D E 每周需要工作5天,休息2天
{
int x;
for(x = 0, s &= 0x7F; s; x++) s &= s - 1;
return x == 5;
}
int c1(int s) //1.所有人的连续工作日不能多于3天(注意:周日连到下周一夜市连续)。
{
while(s && (s & 0xF) - 0xF) s >>= 1;
return s == 0;
}
int c2(int *ss) //2.一周中,至少有3天所有人都是上班的.
{
int i, ms;
for(ms = ss[0], i = 1; i < 5; ms &= ss[i++]);
for(i = 0, ms &= 0x7F; ms; i++) ms &= ms - 1;
return i >= 3;
}
int c3(int *ss) //3.任何一天,必须保证 A B C D 中至少有2人上班.
{
int count[7] = {0}, i, j;
for(i = 0; i < 4; i++)
for(j = 0; j < 7; j++)
count[j] += (ss[i] & (1 << j)) > 0;
for(i = 0; i < 7; i++)
if(count[i] < 2) return 0;
return 1;
}
int c4(int *ss)
{
//return (ss[1] & ss[3] & ss[4] & 0x40) == 0x40; //4.B D E 在周日那天必须上班。
return ((ss[1] | ss[3] | ss[4]) & 0x40) == 0; //4.B D E 在周日那天必须休息。
}
int c5(int *ss) //5.A E周三必须上班。
{
return (ss[0] & ss[4] & 0x4) == 0x4;
}
int c6(int *ss) //6.A C 一周中必须至少有4天能见面(即同时上班)
{
int s, x;
for(x = 0, s = ss[0] & ss[2] & 0x7F; s; x++) s &= s - 1;
return x >= 4;
}
void output(int s)
{
int i;
for(i = 0; i++ < 7; s >>= 1) printf("%d", s & 1);
puts("");
}
int st[128], stn;
int ss[5], ssn;
void traverse(int index)
{
int i;
if(index >= 5)
{
if(c2(ss) && c3(ss) && c4(ss) && c5(ss) && c6(ss))
for(printf("%d:\n", ++ssn), i = 0; i < 5; output(ss[i++]));
return;
}
for(i = 0; i < stn; ss[index] = st[i++], traverse(index + 1));
}
int main()
{
int i, t;
for(i = 0; i < 128; i++)
if(c0(t = (i << 7) + i) && c1(t)) st[stn++] = t;
traverse(0);
return 0;
}
