55.哪個大夫哪天值班
醫(yī)院有A、B、C、D、E、F、G七位大夫,在一星期內(nèi)(星期一至星期天)每人要輪流值班一天?,F(xiàn)在已知:
A大夫比C大夫晚一天值班;
D大夫比E大夫晚二天值班;
B大夫比G大夫早三天值班;
F大夫的值班日在B和C大夫的中間,且是星期四;
請確定每天究竟是哪位大夫值班?
*問題分析與算法設(shè)計
由題目可推出如下已知條件:
*F是星期四值班;
*B值班的日期在星期一至星期三,且三天后是G值班;
*C值班的日期在星期五至星期六,且一天后是A值班;
*E兩天后是D值班;E值班的日期只能在星期一至星期三;
在編程時用數(shù)組元素的下標(biāo)1到7表示星期一到星期天,用數(shù)組元素的值分別表示A~F七位大夫。
*程序與程序注釋
#include
#include
int a[8];
char *day[]={"","MONDAY","TUESDAY","WEDNESDAY","THURSDAYT",
"FRIDAY","SATUDAY","SUNDAY"}; /*建 立星期表*/
void main()
{
int i,j,t;
a[4]=6; /*星期四是F值班*/
for(i=1;i<=3;i++)
{
a[i]=2; /*假設(shè)B值班的日期*/
if(!a[i+3]) a[i+3]=7; /*若三天后無人值班則安排G值班*/
else{ a[i]=0;continue;} /*否則B值班的日期不斷對*/
for(t=1;t<=3;t++) /*假設(shè)E值班的時間*/
{
if(!a[t]) a[t]=5; /*若當(dāng)天無人值班則安排E值班*/
else continue;
if(!a[t+2]) a[t+2]=4; /*若E值班兩天后無人值班則應(yīng)為D*/
else{ a[t]=0;continue;} /*否則E值班的日期不對*/
for(j=5;j<7;j++)
{
if(!a[j]) a[j]=3; /*若當(dāng)天無人值班,則安排C值班*/
else continue;
if(!a[j+1]) a[j+1]=1; /*C之后一天無人值班則應(yīng)當(dāng)是A值班*/
else{ a[j]=0;continue;} /*否則A值班日期不對*/
for(i=1;i<=7;i++) /*安排完畢,輸出結(jié)果*/
printf("Doctor %c is on duty %s.\n",’A’+a[i]-1,day[i]);
exit(0);
}
}
}
}
*運行結(jié)果
Doctor E is on duty MONDAY. (星期一:E)
Doctor B is on duty TUESDAY. (星期二:B)
Doctor D is on duty WEDNESDAY. (星期三:D)
Doctor F is on duty THUESDAY. (星期四:F)
Doctor G is on duty FRIDAY. (星期五:G)
Doctor C is on duty SATURDAY. (星期六:C)
Doctor A is on duty SUNDAY. (星期日:A)
*思考題
在本題的求解過程中,我們只考慮了一星期之內(nèi)的情況,沒有考慮跨周的情況。對于“B大夫比G大夫早三天值班的”條件只是簡單的認(rèn)為是在同一周內(nèi)早三天。若考慮跨周的情況就可能出現(xiàn):B大夫星期一值班,而G大夫是上周的星期五。同樣,對“F大夫的值班日在B和C大夫的中間”這個條件,也可以擴(kuò)展為:“只要F大夫的值班日在B和C大夫的中間就可以”。
請考慮允許跨周的情況下,可能的時間安排表。
醫(yī)院有A、B、C、D、E、F、G七位大夫,在一星期內(nèi)(星期一至星期天)每人要輪流值班一天?,F(xiàn)在已知:
A大夫比C大夫晚一天值班;
D大夫比E大夫晚二天值班;
B大夫比G大夫早三天值班;
F大夫的值班日在B和C大夫的中間,且是星期四;
請確定每天究竟是哪位大夫值班?
*問題分析與算法設(shè)計
由題目可推出如下已知條件:
*F是星期四值班;
*B值班的日期在星期一至星期三,且三天后是G值班;
*C值班的日期在星期五至星期六,且一天后是A值班;
*E兩天后是D值班;E值班的日期只能在星期一至星期三;
在編程時用數(shù)組元素的下標(biāo)1到7表示星期一到星期天,用數(shù)組元素的值分別表示A~F七位大夫。
*程序與程序注釋
#include
#include
int a[8];
char *day[]={"","MONDAY","TUESDAY","WEDNESDAY","THURSDAYT",
"FRIDAY","SATUDAY","SUNDAY"}; /*建 立星期表*/
void main()
{
int i,j,t;
a[4]=6; /*星期四是F值班*/
for(i=1;i<=3;i++)
{
a[i]=2; /*假設(shè)B值班的日期*/
if(!a[i+3]) a[i+3]=7; /*若三天后無人值班則安排G值班*/
else{ a[i]=0;continue;} /*否則B值班的日期不斷對*/
for(t=1;t<=3;t++) /*假設(shè)E值班的時間*/
{
if(!a[t]) a[t]=5; /*若當(dāng)天無人值班則安排E值班*/
else continue;
if(!a[t+2]) a[t+2]=4; /*若E值班兩天后無人值班則應(yīng)為D*/
else{ a[t]=0;continue;} /*否則E值班的日期不對*/
for(j=5;j<7;j++)
{
if(!a[j]) a[j]=3; /*若當(dāng)天無人值班,則安排C值班*/
else continue;
if(!a[j+1]) a[j+1]=1; /*C之后一天無人值班則應(yīng)當(dāng)是A值班*/
else{ a[j]=0;continue;} /*否則A值班日期不對*/
for(i=1;i<=7;i++) /*安排完畢,輸出結(jié)果*/
printf("Doctor %c is on duty %s.\n",’A’+a[i]-1,day[i]);
exit(0);
}
}
}
}
*運行結(jié)果
Doctor E is on duty MONDAY. (星期一:E)
Doctor B is on duty TUESDAY. (星期二:B)
Doctor D is on duty WEDNESDAY. (星期三:D)
Doctor F is on duty THUESDAY. (星期四:F)
Doctor G is on duty FRIDAY. (星期五:G)
Doctor C is on duty SATURDAY. (星期六:C)
Doctor A is on duty SUNDAY. (星期日:A)
*思考題
在本題的求解過程中,我們只考慮了一星期之內(nèi)的情況,沒有考慮跨周的情況。對于“B大夫比G大夫早三天值班的”條件只是簡單的認(rèn)為是在同一周內(nèi)早三天。若考慮跨周的情況就可能出現(xiàn):B大夫星期一值班,而G大夫是上周的星期五。同樣,對“F大夫的值班日在B和C大夫的中間”這個條件,也可以擴(kuò)展為:“只要F大夫的值班日在B和C大夫的中間就可以”。
請考慮允許跨周的情況下,可能的時間安排表。