两个玩家轮流掰一块m*n的巧克力,其中一块1*1的小块是坏的,每次掰只能顺着方格的边界,沿直线一掰到底。每拜一次,掰的人把两块中不含坏巧克力的吃掉,谁碰到最后那块坏巧克力就输了,写一个互动程序,让大家可以和计算机玩,程序在胜局应该走出必胜的一步,在败局只要下出合规的一步就好
   小弟要交作业,急求!!!完整程序更好,只有必胜的算法也可!!各位大人解决一下!!!

解决方案 »

  1.   


    //巧克力大小
    #define M 8
    #define N 8//设置坏巧克力块的位置
    #define X  4
    #define Y  4void print(char cho[M][N])
    {
        //打印出巧克力形状
    for(int i=0;i<M;i++)
    {
    for(int j=0;j<N;j++)
    printf("%d ",cho[i][j]);
    printf("\n");
    }
    }
    //执行掰巧克力的函数
    void Execute(char cho[M][N],char pos,int index)
    {
    //掰下一列
    if(pos=='C' || pos=='c')
    {
    for(int i=0;i<M;i++)
    {
    for(int j=0;j<N;j++)
    if(j==index)cho[i][j]=3;
    }
    }
    //掰下一行
    else if(pos=='R' || pos=='r')
    {
    for(int i=0;i<M;i++)
    {
    if(i==index)
    {
    for(int j=0;j<N;j++)cho[i][j]=3;
    }
    }
    }
    }
    //分析行,给出决策可以掰那些行
    void Row(char cho[M][N],char dm[])
    {
      for(int i=0;i<M;i++)
      {
      int s=-1;
      //去掉坏巧克力所在行
      if(i!=X)
      {
      for(int j=0;j<N;j++)
      {
      if(cho[i][j]!=3)s=1;
      }
      }
          dm[i]=s;
      }
    }
    //分析列,给出决策可以掰那些列
    void Col(char cho[M][N],char dm[])
    {
      for(int j=0;j<N;j++)
      {
      int s=-1;
      //去掉坏巧克力所在列
      if(j!=Y)
      {
      for(int i=0;i<M;i++)
      {
      if(cho[i][j]!=3)s=1;
      }
      }
          dm[j]=s;
      }
    }//预处理,计算机模拟执行掰的过程,然后计算剩余步骤
    int PreDispose(char cho[M][N],char dm[])
    {
    int cnt=0;
    //巧克力块的副本
       char cho_t[M][N];    //可以掰的行标,用1表示
       char row[M];
       //可以掰的列表,用1表示
       char col[N];
       memset(row,-1,M);memset(col,-1,N);   memcpy(cho_t,cho,M*N);
       Execute(cho_t,dm[0],dm[1]);
       
        //分析行,给出决策
       Row(cho,row);
       //分析列,给出决策
       Col(cho,col);   for(int i=0;i<M;i++)
       if(row[i]!=-1)cnt++;
       for(int j=0;j<N;j++)
       if(col[j]!=-1)cnt++;   return cnt;
    }//分析现在的巧克力,并给出决策,掰哪一块
    void Alaysize(char cho[M][N],char dm[2])
    {
       //可以掰的行标,用1表示
       char row[M];
       //可以掰的列表,用1表示
       char col[N];   memset(row,-1,M);memset(col,-1,N);   //分析行,给出决策
       Row(cho,row);
       //分析列,给出决策
       Col(cho,col);
       //进行预处理,判断执行后的剩余次数,找到一个剩余次数为奇数的步骤执行
       for(int i=M-1;i>=0;i--)
       {
       if(row[i] != -1)
       {
               dm[0]='R';
       dm[1]=i;
       if(PreDispose(cho,dm)%2!=0)
       {
       printf("找到最佳步骤:\n");
       return;
       }
       }
       }
       for(int j=N-1;j>=0;j--)
       {
       if(col[j]!=-1)
       {
       dm[0]='C';
       dm[1]=j;
       if(PreDispose(cho,dm)%2!=0)
       {
       printf("找到最佳步骤:\n");
       return;
       }
       }
       }
       //如果没有最佳步骤,则随便走一步
       return;
    }//计算机掰巧克力的过程
    void Computer(char cho[M][N])
    {
       char dm[2];
       dm[0]=-1;dm[1]=-1;
       //让计算机开始分析巧克力,并给出决策
       Alaysize(cho,dm);
       printf("计算机给出决策 %c %d\n",dm[0],dm[1]);
       if(dm[0]==-1 && dm[1] == -1)
       {
       printf("计算机输了\n");
       }
       //掰巧克力
       Execute(cho,dm[0],dm[1]);
    }int Game()
    {
    //制作巧克力
    char cho[M][N]; char pos[10]; char cmd=0;
    int index=0; //设置坏巧克力
    memset(cho,0,M*N);
    cho[X][Y]=1;
         
    //打印巧克力
    print(cho);    printf("请输入命令:\n");
        scanf("%s",pos); while(1)
    {
      cmd=pos[0];
      index=atoi(pos+1);
          
      if(cmd=='Q' || cmd== 'q')break;   //掰巧克力
      Execute(cho,cmd,index);
      //打印出巧克力形状
      print(cho);      //计算机处理
      Computer(cho);
          //打印出巧克力形状
      print(cho);      printf("请输入命令:\n");
      scanf("%s",pos);
    } return 0;
    }从Game函数开始
      

  2.   

    楼上上的代码能再完整点吗?
    error C2065: 'memset' : undeclared identifier
    error C2065: 'atoi' : undeclared identifier