围棋,判断棋子是否存活

//假定本方持黑,对方下子后,判断某黑棋是否被吃掉

#include <iostream>
#include <algorithm>
enum {
  N = 19
};
enum {
  Black,
  White,
  Blank,
  Visited,
};
void foo(int a[][N], int i, int j, bool & r)
{
  std::cout << "-" << i << "," <<j<< "-\n";
  a[i][j] = Visited;
  if ((i-1>=0 && a[i-1][j] == Blank)
    ||(j-1>=0 && a[i][j-1] == Blank)
    ||(j+1<N && a[i][j+1] == Blank)
    ||(i+1<N && a[i+1][j] == Blank)
    )
  {
    r = true;
    return;
  }
  if (i-1 >= 0)
  {
    if (a[i-1][j] == Black)
    {
      foo(a, i - 1, j, r);
    }
  }
 
  if (j-1 >= 0)
  {
    if (a[i][j-1] == Black)
    {
      foo(a, i, j -1, r);
    }
  }
 
  if (i+1 < N)
  {
    if (a[i+1][j] == Black)
    {
      foo(a, i + 1, j, r);
    }
  }
 
  if (j+1 < N)
  {
    if (a[i][j+1] == Black)
    {
      foo(a, i, j +1, r);
    }
  }
}
 
int main()
{
  bool r = false;
  int a[N][N];
  std::fill(&a[0][0], &a[1][0], Black);
 
  std::fill(&a[1][0], &a[N][0], White);
  for (int i = 0 ; i<N; ++i)
  {
    a[i][0] = Black;
  }
  for (int i = 0 ; i<N; ++i)
  {
    a[i][9] = Black;
  }
  a[8][8] = Blank;
  foo(a,0, 5, r);
  std::cout << r << std::endl;
}
Posted 2018-05-01