| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 402 人关注过本帖
标题:逻辑题,求大神看一下程序哪有问题
只看楼主 加入收藏
tompobing
Rank: 8Rank: 8
等 级:蝙蝠侠
帖 子:260
专家分:809
注 册:2012-12-9
结帖率:78.13%
收藏
已结贴  问题点数:10 回复次数:5 
逻辑题,求大神看一下程序哪有问题
医院有A、B、C、D、E、F、G七位大夫,在一星期内(星期一至星期天)每人要轮流值班一天。现在已知:
        A大夫比C大夫晚一天值班;
        D大夫比E大夫晚二天值班;
        B大夫比G大夫早三天值班;
        F大夫的值班日在B和C大夫的中间,且是星期四;
    请确定每天究竟是哪位大夫值班?
*问题分析与算法设计
    由题目可推出如下已知条件:
        *F是星期四值班;
        *B值班的日期在星期一至星期三,且三天后是G值班;
        *C值班的日期在星期五至星期六,且一天后是A值班;
        *E两天后是D值班;E值班的日期只能在星期一至星期三;
    在编程时用数组元素的下标1到7表示星期一到星期天,用数组元素的值分别表示A~F七位大夫。





#include <stdio.h>
int f(int *a)
{
    a[6]=4;
    int t1=a[2]>=1&&a[2]<=3&&a[2]+3==a[7];
    int t2=a[3]>=5&&a[3]<=6&&a[3]+1==a[1];
    int t3=a[5]>=1&&a[5]<=3&&a[5]+2==a[4];
    return t1&&t2&&t3;
}
void show(int *a)
{
    for(int i=1;i<=7;i++)
        printf("%d\n",a[i]);
}
void g(int *a,int n)
{
    if(n>=7)
    {
        if(f(a)) show(a);
        return;
    }
    a[n]=1;
    g(a,n+1);
    a[n]=2;
    g(a,n+1);
    a[n]=3;
    g(a,n+1);
    a[n]=4;
    g(a,n+1);
    a[n]=5;
    g(a,n+1);
    a[n]=6;
    g(a,n+1);
    a[n]=7;
    g(a,n+1);
}

main()
{
    int a[]={0,0,0,0,0,0,0};
    g(a,1);
}

搜索更多相关主题的帖子: 大夫 
2013-01-31 22:59
心灯甚亮
Rank: 8Rank: 8
等 级:蝙蝠侠
威 望:2
帖 子:441
专家分:996
注 册:2013-1-29
收藏
得分:3 
你的f函数长的好怪异 且对数组的访问越界了
2013-02-01 11:15
rjsp
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:版主
威 望:528
帖 子:9007
专家分:53942
注 册:2011-1-18
收藏
得分:3 
F大夫的值班日在B和C大夫的中间
则可能是 BFC,也可能是CFB
2013-02-01 12:14
rjsp
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:版主
威 望:528
帖 子:9007
专家分:53942
注 册:2011-1-18
收藏
得分:0 
因为F为星期4,余下6个的排列组合数目为 6! = 720,所以可以直接用暴力遍历
我用C++代码作个示范:
程序代码:
#include <iostream>
#include <algorithm>
using namespace std;

int main()
{
    //             A0 B1 C2 D3 E4 G5
    int buf[6] = { 1, 2, 3, 5, 6, 7 };
    const int& A = buf[0];
    const int& B = buf[1];
    const int& C = buf[2];
    const int& D = buf[3];
    const int& E = buf[4];
    const int& F = 4;
    const int& G = buf[5];
    while( next_permutation(buf,buf+6) )
    {
        if( A-C == 1
            && D-E == 2
            && G-B == 3
            && ( (B<F&&C>F) || (B>F&&C<F) ) )
        {
            printf( "A=%d\nB=%d\nC=%d\nD=%d\nE=%d\nF=%d\nG=%d\n", A,B,C,D,E,F,G );
        }
    }

    return 0;
}
输出为
A=7
B=2
C=6
D=3
E=1
F=4
G=5
2013-02-01 12:38
洪荒一鼎
Rank: 2
等 级:论坛游民
帖 子:34
专家分:46
注 册:2012-6-27
收藏
得分:3 
回复 3楼 rjsp
只可能是BFC因为B比G早三天

不知道,不懂,知道,了解,懂,精通
2013-02-01 13:19
tompobing
Rank: 8Rank: 8
等 级:蝙蝠侠
帖 子:260
专家分:809
注 册:2012-12-9
收藏
得分:0 
回复 4楼 rjsp
const int& A = buf[0];
     const int& B = buf[1];
     const int& C = buf[2];
     const int& D = buf[3];
     const int& E = buf[4];
     const int& F = 4;
     const int& G = buf[5];

这几句什么意思,const int&是什么。。
2013-02-01 19:03
快速回复:逻辑题,求大神看一下程序哪有问题
数据加载中...
 
   



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

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