用编程解决推理问题
灌水问题,现有1升,2升,3升,4升,5升,各4桶(5×4=20),甲乙两个人轮番往一个27升的坛子里灌水(甲乙甲乙甲乙。。),只许用上面的20桶水,不许半桶,不许小桶之间来回倒,倒过之后的空桶不许再灌水。最后一个灌满27升坛子的人获胜,超过27升者算输。
问题:
A,甲或者乙,是否有100%把握获胜?
B,如果你是甲,你第一桶水会选择几升?
用编程分析出所有可能的情况~~我的想法还不完善~~谁来尝试一下
#include <stdlib.h> int PC[5]= { 4,4,4,4,4 } ; int YOU[5]= { 4,4,4,4,4 } ; int TOTAL=27 ; void PPrintf(int pc[],int you[],int total); int PCfun(int total); int YOUfun(); int init(); int main() { char key ; while(1) { printf("请选择谁先选 1。你 2.电脑\n"); do { key=getchar(); } while(!(key=='1'||key=='2')); if(key=='1') { PPrintf(PC,YOU,TOTAL); TOTAL-=YOUfun(); } while(TOTAL) { PPrintf(PC,YOU,TOTAL); TOTAL-=PCfun(TOTAL); if(TOTAL) { PPrintf(PC,YOU,TOTAL); TOTAL-=YOUfun(); } } getchar(); printf("还要再来么? y \n"); key=getchar(); if(key!='y')break ; TOTAL=init(); } } int init() { for(int i=0;i<5;i++) { PC[i]=YOU[i]=4 ; } return 27 ; } int PCfun(int total) { int i ; if(total==0) { printf("你真强!我输了!\n"); return 0 ; } else if(total<6&&PC[total]) { printf("你输了!我选 %2d\n",total); return total ; } else { if(total%6&&PC[total%6-1]) { PC[total%6-1]--; printf("PC选择了 %2d\n",total%6); return total%6 ; } else { while(1) { i=rand()%4 ; if(PC[i])break ; } PC[i]--; printf("PC选择了 %2d\n",i+1); return i+1 ; } } } int YOUfun() { int i ; printf("请选择灌多少升?\n"); while(1) { while(scanf("%d",&i)!=1)getchar(); if(i<1||i>5) { printf("请重选择,你的选择不合法!\n"); continue ; } if(YOU[i-1]) { printf("你选了 %d 升\n",i); YOU[i-1]--; return i ; } else { printf(" %d 升的水已用完,请重选!\n",i); } } } void PPrintf(int pc[],int you[],int total) { printf("\n你现有:1升%2d,2升%2d,3升%2d,4升%2d,5升%2d \n",you[0],you[1],you[2],you[3],you[4]); printf("PC现有:1升%2d,2升%2d,3升%2d,4升%2d,5升%2d \n",pc[0],pc[1],pc[2],pc[3],pc[4]); printf("桶还能装下: %2d\n\n",total); } |
索性给你写一个
[此贴子已经被作者于2005-11-16 21:17:13编辑过]