zoukankan      html  css  js  c++  java
  • uva 220 模拟黑白棋ac

    #include <cstdio>
    using namespace std;
    const int dr[] = { -1,-1,0,1,1, 1, 0,-1 };
    const int dc[] = {  0, 1,1,1,0,-1,-1,-1 };
    char col;
    char board[15][15];
    char cmd[5];
    bool legal(int r, int c)
    {
     return r > 0 && r <= 8 && c > 0 && c <= 8;
    }
    char next()
    {
     return col == 'W' ? 'B' : 'W';//const char SUM = 'W' + 'B';
    }
    bool one_line(int r, int c, int dir)
    {
     int enemy_cnt = 0, my_cnt = 0;
     while (legal(r + dr[dir], c + dc[dir]))
     {
      r += dr[dir], c += dc[dir];
      char cur = board[r][c];
      if (cur == '-')break;
      if (cur == col) { my_cnt++;break; }
      enemy_cnt++;//对方的棋子
     }
     if (my_cnt&&enemy_cnt)return true;
     return false;
    }
    bool visit(int r, int c)
    {
     if (board[r][c] != '-')return false;
     for (int i = 0;i < 8;i++)
      if (one_line(r, c, i))return true;
     return false;
    }
    void L_fun()
    {
     int num = 0;
     for(int i=1;i<=8;i++)
      for(int j=1;j<=8;j++)
        if (visit(i, j))
        {
         if (num++)printf(" ");
         printf("(%d,%d)", i, j);
        }
     if (num)
      printf("
    ");
     else printf("No legal move.
    ");
    }
    void move(int r,int c)
    {
     
     for (int i = 0;i < 8;i++)
      if (one_line(r, c, i))
      {
       int nr = r, nc = c;//千万千万不要改变r,c的值,八个方向都要用到--bug了一天 热
       while (legal(nr + dr[i], nc + dc[i]))
       {
        nr += dr[i], nc += dc[i];
        if (board[nr][nc] == col)break;
        board[nr][nc] = col;
       }
      }
     board[r][c] = col;
     col = next();//换子了兄弟
    }
    void WandB_cal()
    {
     int W_cnt = 0, B_cnt = 0;
     for (int i = 1;i <= 8;i++)
      for (int j = 1;j <= 8;j++)
       if (board[i][j] == '-')continue;
       else if (board[i][j] == 'W')W_cnt++;
       else B_cnt++;
       printf("Black - %2d White - %2d
    ", B_cnt, W_cnt);
    }
    void M_fun()
    {
     int r = cmd[1] - '0', c = cmd[2] - '0';
     if (!visit(r, c))col = next();
     move(r, c);
     WandB_cal();
    }
    void print_board()
    {
     for (int i = 1;i <= 8;i++)
      printf("%s", board[i] + 1);//自带换行fgets
    }
    int main()
    {
     int n;
     scanf("%d%*c", &n);
     while (n--)
     {
      for (int i = 1;i <= 8;i++)//从1开始!!!!!!
       fgets(board[i] + 1, 12, stdin);
      scanf("%s%*c", cmd);
      col = cmd[0];
      while (scanf("%s%*c", cmd) == 1)//加%*c免得坑了后面的fgets队友
      {
       char ch = cmd[0];
       if (ch == 'Q') {
        print_board();break;
       }
       //if (ch == 'W' || ch == 'B')col = ch;
       else if (ch == 'L')L_fun();
       else if (ch == 'M')M_fun();
      }
      //打印
      
      if (n != 0)printf("
    ");
     }
     return 0;
    }
  • 相关阅读:
    jdk8数组和List相互转换
    elementUI修改单选框样式
    StringBuffer和StringBuilder的区别
    npm install --save 与 npm install --save-dev 的区别
    视频上传到阿里云oss把视频的第一帧作为封面图的方式
    mysql建订单表还范了个order错误
    java面试JVM轰炸问题
    注意Java和JavaScript去掉字符串最后一个字符常用写法的区别
    虚拟机NAT模式连接外网
    Hadoop集群初步搭建:
  • 原文地址:https://www.cnblogs.com/schsb/p/7912118.html
Copyright © 2011-2022 走看看