回复 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; }