本人的人工智能作業,貼在這裏,僅供交流,如果有疑問歡迎聯繫。
- #include <stdio.h>
- #include <stdlib.h>
- #include <string.h>
- #define WIN 65535
- int money[1024];
- int divide(int n,int num)
- {
- int i,j,k,flag=0,p=0,q=0,max=0;
- for ( i = 0; i < n; i++)
- {
- if (money[i] > 2) //如果錢幣數目小於2,不可再分
- {
- flag=1;
- max=0;
- for (j = 1; j < (money[i]+1)/2; j++)
- {
- for ( k = n; k > i+1; k--)//將錢幣分爲兩堆
- {
- money[k]=money[k-1];
- }
- money[i+1]=money[i]-j;
- money[i]=j;
- if (divide(n+1,num+1) > max)//分爲兩堆後,繼續讓對手分
- {
- max=divide(n+1,num+1);//記錄分後的最好結果
- p=i;
- q=j;
- }
- money[i]+=money[i+1];//還原分堆
- for ( k = i+1; k < n+1; k++)
- {
- money[k]=money[k+1];
- }
- }
- }
- }
- if (num == 0)//找到最好的結果,按此分堆
- {
- for ( k = n; k > p+1; k--)
- {
- money[k]=money[k-1];
- }
- money[p+1]=money[p]-q;
- money[p]=q;
- }
- if (flag == 0)//如果不能再分,則獲勝
- {
- return WIN;
- }
- else
- {
- return max;
- }
- }
- int main()
- {
- int i,n,flag=0;
- scanf("%d",&n);
- memset(money,0,sizeof(money));
- money[0]=n;
- i=1;
- while(1)
- {
- for ( i = 0; ; i++)//輸入分堆方案
- {
- scanf("%d",&money[i]);
- if (money[i] == 0)
- {
- break;
- }
- }
- flag=0;
- for ( i = 0;money[i] != 0; i++)
- {
- if (money[i] > 2)
- {
- flag=1;
- }
- }
- if (flag == 0)//判斷結果
- {
- printf("Computer Lost!\n");
- break;
- }
- divide(i,0);//電腦分堆
- flag=0;
- for ( i = 0;money[i] != 0; i++)//輸出電腦分堆結果
- {
- printf("%d ",money[i]);
- if (money[i] > 2)
- {
- flag=1;
- }
- }
- printf("\n");
- if (flag == 0)//判斷結果
- {
- printf("You Lost!\n");
- break;
- }
- }
- system("PAUSE");
- return 0;
- }