标题:这道题把我困扰好久,求指点。
只看楼主
dengluoy
Rank: 3Rank: 3
等 级:论坛游侠
帖 子:127
专家分:165
注 册:2013-2-5
得分:0 
回复 20楼 azzbcc
谢谢版主。。

一同学习, 一同进步
2013-04-23 22:26
y3765258
Rank: 3Rank: 3
等 级:论坛游侠
帖 子:106
专家分:172
注 册:2013-4-9
得分:0 
回复 20楼 azzbcc
person[i] = vol[ tmp % 7 ];    这里的person数组   为什么没有越界?

有问题一起探讨,一起进步。
2013-04-24 09:13
azzbcc
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
来 自:江西财经大学
等 级:贵宾
威 望:81
帖 子:3293
专家分:12919
注 册:2012-11-4
得分:0 
确实越界了,当时敲得着急,没有仔细检查,不好意思,循环条件应该是 for (i = 0;i < 5;++i)

应该还会有其他错误吧,多谢指出,不够细心呢


[fly]存在即是合理[/fly]
2013-04-24 10:06
dengluoy
Rank: 3Rank: 3
等 级:论坛游侠
帖 子:127
专家分:165
注 册:2013-2-5
得分:0 
回复 23楼 azzbcc
版主你的vol[] 数组会不会初始化错了,?应该是这样对么,?
const int vol[] = {0x37, 0x3b, 0x5b, 0x5d, 0x6d, 0x6e, 0x76};
我也不懂,- - 。

一同学习, 一同进步
2013-04-25 18:32
azzbcc
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
来 自:江西财经大学
等 级:贵宾
威 望:81
帖 子:3293
专家分:12919
注 册:2012-11-4
得分:0 
以下是引用dengluoy在2013-4-25 18:32:31的发言:

版主你的vol[] 数组会不会初始化错了,?应该是这样对么,?
const int vol[] = {0x37, 0x3b, 0x5b, 0x5d, 0x6d, 0x6e, 0x76};
我也不懂,- - 。
是我错了,难怪没有正确结果,我把代码改改吧,这么多错误。。。


[fly]存在即是合理[/fly]
2013-04-25 19:56
dengluoy
Rank: 3Rank: 3
等 级:论坛游侠
帖 子:127
专家分:165
注 册:2013-2-5
得分:0 
回复 25楼 azzbcc
就是没有正确答案。然后以前我没有重视位运算,现在你写出来以后才知道位运算这么的好。。
- -,我今天就研究一天的位运算。

一同学习, 一同进步
2013-04-25 20:11
beyondyf
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
等 级:贵宾
威 望:103
帖 子:3282
专家分:12654
注 册:2008-1-21
得分:0 
呵呵,来看看解决的怎么样了

重剑无锋,大巧不工
2013-04-25 20:23
dengluoy
Rank: 3Rank: 3
等 级:论坛游侠
帖 子:127
专家分:165
注 册:2013-2-5
得分:0 
程序代码:
#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;
}

我这样改了以后不知道对不对,- - 。。

一同学习, 一同进步
2013-04-25 21:18
beyondyf
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
等 级:贵宾
威 望:103
帖 子:3282
专家分:12654
注 册:2008-1-21
得分:0 
楼上给的第4条件与楼主的第4条件不同。BDE周日休息,则有4组结果;如果上班则有24组。

算法没有本质的区别,只是使用的个人技巧不同,凑热闹了。

程序代码:
#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;
}

重剑无锋,大巧不工
2013-04-26 00:01



参与讨论请移步原网站贴子:https://bbs.bccn.net/thread-405071-1-1.html




关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.184573 second(s), 8 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved