分钱币的博弈问题

本人的人工智能作业,贴在这里,仅供交流,如果有疑问欢迎联系。

  
  
  
  
  1. #include <stdio.h>  
  2. #include <stdlib.h>  
  3. #include <string.h>  
  4. #define WIN 65535  
  5.  
  6. int money[1024];  
  7.  
  8. int divide(int n,int num)  
  9. {  
  10.     int i,j,k,flag=0,p=0,q=0,max=0;  
  11.     for ( i = 0; i < n; i++)  
  12.     {  
  13.         if (money[i] > 2) //如果钱币数目小于2,不可再分  
  14.         {  
  15.             flag=1;  
  16.             max=0;  
  17.             for (j = 1; j < (money[i]+1)/2; j++)  
  18.             {  
  19.                 for ( k = n; k > i+1; k--)//将钱币分为两堆  
  20.                 {  
  21.                     money[k]=money[k-1];  
  22.                 }  
  23.                 money[i+1]=money[i]-j;  
  24.                 money[i]=j;  
  25.                 if (divide(n+1,num+1) > max)//分为两堆后,继续让对手分  
  26.                 {  
  27.                     max=divide(n+1,num+1);//记录分后的最好结果  
  28.                     p=i;  
  29.                     q=j;  
  30.                 }  
  31.                 money[i]+=money[i+1];//还原分堆  
  32.                 for ( k = i+1; k < n+1; k++)  
  33.                 {  
  34.                     money[k]=money[k+1];  
  35.                 }  
  36.             }  
  37.         }  
  38.     }  
  39.     if (num == 0)//找到最好的结果,按此分堆  
  40.     {  
  41.         for ( k = n; k > p+1; k--)  
  42.         {  
  43.             money[k]=money[k-1];  
  44.         }  
  45.         money[p+1]=money[p]-q;  
  46.         money[p]=q;  
  47.     }  
  48.     if (flag == 0)//如果不能再分,则获胜  
  49.     {  
  50.         return WIN;  
  51.     }  
  52.     else 
  53.     {  
  54.         return max;  
  55.     }  
  56. }  
  57.  
  58. int main()  
  59. {  
  60.     int i,n,flag=0;  
  61.     scanf("%d",&n);  
  62.     memset(money,0,sizeof(money));  
  63.     money[0]=n;  
  64.     i=1;  
  65.     while(1)  
  66.     {  
  67.         for ( i = 0; ; i++)//输入分堆方案  
  68.         {  
  69.             scanf("%d",&money[i]);  
  70.             if (money[i] == 0)  
  71.             {  
  72.                 break;  
  73.             }  
  74.         }  
  75.         flag=0;  
  76.         for ( i = 0;money[i] != 0; i++)  
  77.         {  
  78.             if (money[i] > 2)  
  79.             {  
  80.                 flag=1;  
  81.             }  
  82.         }  
  83.         if (flag == 0)//判断结果  
  84.         {  
  85.             printf("Computer Lost!\n");  
  86.             break;  
  87.         }  
  88.         divide(i,0);//电脑分堆  
  89.         flag=0;  
  90.         for ( i = 0;money[i] != 0; i++)//输出电脑分堆结果  
  91.         {  
  92.             printf("%d ",money[i]);  
  93.             if (money[i] > 2)  
  94.             {  
  95.                 flag=1;  
  96.             }  
  97.         }  
  98.         printf("\n");  
  99.         if (flag == 0)//判断结果  
  100.         {  
  101.             printf("You Lost!\n");  
  102.             break;  
  103.         }  
  104.     }  
  105.     system("PAUSE");  
  106.     return 0;  

 

你可能感兴趣的:(职场,博弈,休闲,博弈问题,分钱币)