88.常勝將軍
現(xiàn)有21根火柴,兩人輪流取,每人每次可以取走1至4根,不可多取,也不能不取,誰取最后一楰火柴誰輸。請(qǐng)編寫一個(gè)程序進(jìn)行人機(jī)對(duì)弈,要求人先取,計(jì)算機(jī)后??;計(jì)算機(jī)一方為“常勝將軍”。
*問題分析與算法設(shè)計(jì)
在計(jì)算機(jī)后走的情況下,要想使計(jì)算機(jī)成為“常勝將軍”,必須找出取 關(guān)鍵。根據(jù)本題的要求枷以總結(jié)出,后走一方取子的數(shù)量與對(duì)方剛才一步取子的數(shù)量之和等于,就可以保證最后一個(gè)子是留給先取子的那個(gè)人的。
據(jù)此分析進(jìn)行算法設(shè)計(jì)就是很簡單的工作,編程實(shí)現(xiàn)也十分容易。
*程序與程序注釋
#include
void main()
{
int a=21,i;
printf("Game begin:\n");
while(a>0)
{
do{
printf("How many stick do you wish to take(1~%d)?",a>4?4:a);
scanf("%d",&i);
}while(i>4||i<1||i>a); /*接收正在確的輸入*/
if(a-i>0) printf(" %d stick left in the pile.\n",a-i);
if((a-i)<=0)
{
printf(" You have taken the last stick.\n");
printf(" * * * You lose! \nGame Over.\n"); /*輸出取勝標(biāo)記*/
break;
}
else
printf(" Compute take %d stick.\n",5-i); /*輸出計(jì)算機(jī)取的子數(shù)*/
a-=5;
printf(" %d stick left in the pile.\n",a);
}
}
現(xiàn)有21根火柴,兩人輪流取,每人每次可以取走1至4根,不可多取,也不能不取,誰取最后一楰火柴誰輸。請(qǐng)編寫一個(gè)程序進(jìn)行人機(jī)對(duì)弈,要求人先取,計(jì)算機(jī)后??;計(jì)算機(jī)一方為“常勝將軍”。
*問題分析與算法設(shè)計(jì)
在計(jì)算機(jī)后走的情況下,要想使計(jì)算機(jī)成為“常勝將軍”,必須找出取 關(guān)鍵。根據(jù)本題的要求枷以總結(jié)出,后走一方取子的數(shù)量與對(duì)方剛才一步取子的數(shù)量之和等于,就可以保證最后一個(gè)子是留給先取子的那個(gè)人的。
據(jù)此分析進(jìn)行算法設(shè)計(jì)就是很簡單的工作,編程實(shí)現(xiàn)也十分容易。
*程序與程序注釋
#include
void main()
{
int a=21,i;
printf("Game begin:\n");
while(a>0)
{
do{
printf("How many stick do you wish to take(1~%d)?",a>4?4:a);
scanf("%d",&i);
}while(i>4||i<1||i>a); /*接收正在確的輸入*/
if(a-i>0) printf(" %d stick left in the pile.\n",a-i);
if((a-i)<=0)
{
printf(" You have taken the last stick.\n");
printf(" * * * You lose! \nGame Over.\n"); /*輸出取勝標(biāo)記*/
break;
}
else
printf(" Compute take %d stick.\n",5-i); /*輸出計(jì)算機(jī)取的子數(shù)*/
a-=5;
printf(" %d stick left in the pile.\n",a);
}
}

