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;
}
原文地址:https://www.cnblogs.com/schsb/p/7912118.html