火柴游戏问题。这个问题,我看了好久,没有看出来个所以然,郁闷! /* 9. 四人玩火柴棍游戏,每一次都是三个人赢,一个人输。输的人要按赢者手中的火柴 数进行赔偿,即赢者手中有多少根火柴棍,输者就赔偿多少根。现知道玩过四次后, 每人恰好输过一次, 而且每人手中都正好有16根火柴。问此四人做游戏前手中各有 多少根火柴? 编程解决此问题。 分析: 第一次假设a输了 第二次假设b输了 第三次假设c输了 第四次假设d输了 a a=a-b-c-d a=a*2 a=a*2 a=a*2=16 b b=b+a b=b-a-c-d b=b*2 b=b*2=16 c c=c+a c=c*2 c=c-a-b-d c=c*2=16 d d=d+a d=d*2 d=d*2 d=d-a-b-c=16 思路:这个题首先肯定的是,要倒推,但是怎么个倒推法,这个就难了。四个人每人输一次,当a[0]输的时候,先将别的值各半。最后别的值减少的赋给a[0]; 这样一直循环,关键我怎么就没有想到呢,这两个for循环,这样有序的运行,到底,我们应该思考些什么呢,是不是因该自己拿几个棍棍试试呢,还是 好好想一想这个游戏到底是怎样进行的,按什么规律进行?哎,反正我是没有想出来。 */ #include <iostream> using namespace std; int main() {// 思路,倒推 int sum = 0; int total = 64; int a[4] = { 16, 16, 16, 16 }; for ( int i = 0; i < 4; i++ )//四次游戏,四个人每人一次 { for ( int j = 0; j < 4; j++ )//四次重新赋值 { if ( j == i )//输的不用重新赋值 { continue; } a[j] /= 2; sum += a[j]; } a[i] = total - sum;//输的人重新赋值 sum = 0; } for ( int j = 0; j < 4; j++ )//输出 { cout<<a[j] << " "; } cout << endl; return 0; } /*#include <iostream> using namespace std; int main() { int a=16,b=16,c=16,d=16; for(int i=1;i<=3;i++) { a=a/2; } for(int i=1;i<=2;i++) { b=b/2; } for(int i=1;i<=3;i++) { c=c/2; } for(int i=1;i<=3;i++) { d=d/2; } } */