Q:有21根火柴,两人轮流取,每人每次可以取走1~4根,不可多取,也不能不取,谁取最后一根谁输。编写一个程序,要求人先取,计算机后取;计算机一方为常胜将军。
分析:想让计算机一方为常胜将军,也就是要让人取到最后一根火柴。这样只有一种可能,让计算机给人只留下1根火柴,因此此时人至少取1根火柴。其他情况无法保证计算机常胜。
于是问题转化成“有20根火柴,两人轮流取,每人每次可以取1~4根,不可以多取,也不能不取,要求人先取,计算机后取,谁取最后一根谁赢。”为了让计算机取到最后一根火柴,就要保证最后一轮的抽取之前剩下5根火柴。因为只有这样,无论人怎么样取火柴,计算机都能将其余的火柴全部取走。
于是问题又转换成“有15根火柴,两人轮流取,每人每次可以取1~4根,不可以多取,也不能不取,要求人先取,计算机后取,保证计算机取最后一个火柴”。
于是问他转换成“有10根火柴,两人轮流取,每人每次可以取1~4根……“
最后结论:21根火柴,人先取,计算机后取,每次取1~4根的前提下,只要保证每一轮的抽取人抽到的火彩数与计算机抽到的火柴数之和为5就可以实现计算机的常胜。
#include <iostream>
using namespace std;
int main() {
int computer,people,spare=21;
cout<<"GAME begins:"<<endl;
while(1) {
cout<<"————————目前剩余火柴数————————"<<spare<<endl;
cout<<"people: ";
cin>>people;
if(people<1 || people>4 || people>spare) {
cout<<"违规,取火柴数有问题!"<<endl;
continue;
}
spare=spare-people;
if(spare==0) {
cout<<"Computer win!Game over!";
break;
}
computer=5-people;
spare=spare-computer;
cout<<"computer: "<<computer<<endl;
if(spare==0) {
cout<<"people win!Game over!"<<endl;
break;
}
}
return 0;
}