标题:编程问题,很急,后天要交给老师,求大神帮帮忙。拜托各位了
只看楼主
左宝仓
Rank: 1
等 级:新手上路
帖 子:5
专家分:0
注 册:2017-7-30
结帖率:100%
已结贴  问题点数:20 回复次数:5 
编程问题,很急,后天要交给老师,求大神帮帮忙。拜托各位了
医院有A、B、C、D、E、F、G七位大夫,在一星期内(星期一至星期天)每人要轮流值班一天。现在已知:
A大夫比C大夫玩一天值班;
D大夫比E大夫晚二天值班;
B大夫比G大夫早三天值班;
F大夫的值班日在B和C大夫的中间,且是星期四;
请确定每天究竟是哪位大夫值班?
要考虑跨周情况,不单单是从星期一开始。
搜索更多相关主题的帖子: 编程 老师 医院 
2017-07-30 10:14
rjsp
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:版主
威 望:507
帖 子:8890
专家分:53117
注 册:2011-1-18
得分:8 
程序代码:
#include <iostream>

int main( void )
{
    char buf[7] = { 0, 0, 0, 0, 'F', 0, 0 };
    for( size_t i=0; i!=7; ++i )
    {
        if( buf[i]==0 && buf[(i+1)%7]==0 )
        {
            buf[i]='C', buf[(i+1)%7]='A';

            for( size_t j=0; j!=7; ++j )
            {
                if( buf[j]==0 && buf[(j+2)%7]==0 )
                {
                    buf[j]='E', buf[(j+2)%7]='D';

                    for( size_t k=0; k!=7; ++k )
                    {
                        if( buf[k]==0 && buf[(k+3)%7]==0 )
                        {
                            buf[k]='B', buf[(k+3)%7]='G';

                            if( (k<4 && i>4) || (k>4 && i<4) )
                                std::cout.write(buf,7) << '\n';

                            buf[k]=0, buf[(k+3)%7]=0;
                        }
                    }

                    buf[j]=0, buf[(j+2)%7]=0;
                }
            }

            buf[i]=0, buf[(i+1)%7]=0;
        }
    }
}
输出 // 从星期日到星期6
CAGEFDB
AEBDFGC

即使你懒得想,用暴力遍历,也只需要 7!=5040 次
程序代码:
#include <iostream>
#include <algorithm>
using namespace std;

int main( void )
{
                    // A B C D E F G
    unsigned day[] = { 0,1,2,3,4,5,6 };
    do
    {
        unsigned A = day[0];
        unsigned B = day[1];
        unsigned C = day[2];
        unsigned D = day[3];
        unsigned E = day[4];
        unsigned F = day[5];
        unsigned G = day[6];
       

        if( (C+1)%7 == A                                // CA
            && (E+2)%7 == D                             // E?D
            && (B+3)%7 == G                             // B??G
            && F==4 && ((F>B && F<C) || (F>C && F<B)) ) // B…F(4)…C or C…F(4)…B
        {
            char doctors[7];
            doctors[day[0]] = 'A';
            doctors[day[1]] = 'B';
            doctors[day[2]] = 'C';
            doctors[day[3]] = 'D';
            doctors[day[4]] = 'E';
            doctors[day[5]] = 'F';
            doctors[day[6]] = 'G';
            cout.write(doctors,7) << '\n';
        }

    } while( std::next_permutation(day,day+7) );
}
输出 // 从星期日到星期6
AEBDFGC
CAGEFDB


2017-07-31 09:09
左宝仓
Rank: 1
等 级:新手上路
帖 子:5
专家分:0
注 册:2017-7-30
得分:0 
回复 2楼 rjsp
大神,你这个不满足,B比G早3天啊
2017-07-31 16:22
yangfrancis
Rank: 16Rank: 16Rank: 16Rank: 16
等 级:贵宾
威 望:141
帖 子:1510
专家分:7661
注 册:2014-5-19
得分:6 
//暴力解决
#include<iostream>
#include<algorithm>
using namespace std;
short doc[7]={1,2,3,4,5,6,7};//下标[0]为周日,[6]为周六,取值1~7为A到G
short i;
int main()
{
    do
    {
        
        if(doc[4]!=6)continue;//f是否周四
        if(doc[3]+doc[5]!=5&&doc[2]+doc[6]!=5&&doc[1]+doc[0]!=5)//F大夫的值班日在B和C大夫的中间
            continue;
        for(i=0;i<7;i++)
        {
            if(doc[i]==1&&doc[(i+6)%7]==3) break;//是否A大夫比C大夫玩一天值班;
        }
        if(i==7) continue;
        for(i=0;i<7;i++)
        {
            if(doc[i]==4&&doc[(i+5)%7]==5) break;//是否D大夫比E大夫晚二天值班;
        }
        if(i==7) continue;
        for(i=0;i<7;i++)
        {
            if(doc[i]==2&&doc[(i+10)%7]==7) break;//是否B大夫比G大夫早三天值班;
        }
        if(i==7) continue;
        break;
    }
    while(next_permutation(doc,doc+7));
    for(i=0;i<7;i++) cout<<(char)(doc[i]-1+'A')<<'\t';cout<<endl;
    return 0;
}
2017-07-31 22:34
左宝仓
Rank: 1
等 级:新手上路
帖 子:5
专家分:0
注 册:2017-7-30
得分:0 
回复 4楼 yangfrancis
大神,你这个只有一种情况啊
2017-07-31 22:47
yangfrancis
Rank: 16Rank: 16Rank: 16Rank: 16
等 级:贵宾
威 望:141
帖 子:1510
专家分:7661
注 册:2014-5-19
得分:6 
你还想要所有情况啊?稍改一下就好了。把break语句改成输出就行了
2017-08-01 16:34



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




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

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