问题:54张扑克牌,两个人轮流拿牌,每人每次最少取1张牌,最多取4张,谁最后一张拿牌谁输,编写模拟计算机先拿牌且必胜的算法。
思路:首先N=1+4=5
(54-1)/5=10余3
故先拿牌者取3张即可稳保胜利。
操作如下:
计算机先拿三张后,执行如下原则:
玩家拿1张,计算机拿4张;
玩家拿2张,计算机拿3张;
玩家拿3张,计算机拿2张;
玩家拿4张,计算机拿1张;
就是保持每轮双方一共拿走5张牌,这样计算机最后一次取牌后扑克牌就只剩一张,玩家必输。
C程序:
#include<stdio.h>
int main(){int s=0; //记录总张数
int k; //记录一次出的牌张数
int t; //最后为计算机出牌时,t为1,人出牌时,t为0
t=1; //首先计算机出牌,t变为1
k=3;
printf("机:%d\n",k);
s=s+k;
do{
printf("现在剩%d张\n",54-s); //提示玩家剩余张数
t=0; //玩家出牌,t变为0
printf("人:");
scanf("%d",&k);
while(k<1||k>4) //判断玩家出牌是否符合规则
{
printf("每人每次最少取1张牌,最多取4张,请重新输入\n");
t=0;
printf("人:");
scanf("%d",&k);
};
s=s+k;
t=1;
k=5-k;
printf("机:%d\n",k);
s=s+k;
}
while(s<53);
printf("现在剩%d张\n",54-s);
t=0;
printf("人:");
scanf("%d",&k);
s=s+k;
if(s==54)
printf("%d张扑克牌已取完\n",s);
if(t==0)
printf("计算机胜!");
else
printf("玩家胜!");
return 0;
}