天天看點

HDU-1045

#include<bits/stdc++.h>
using namespace std;
int n, ans, dir[4][2] = { 1,0,0,1,-1,0,0,-1 };
char mp[10][10];
int check(int x, int y)
{
  if (mp[x][y] != '.')return 0;
  int dx, dy;
  for (int i = 0; i < 4; i++)
  {
    dx = x + dir[i][0];
    dy = y + dir[i][1];
    while (true)
    {
      if (dx < 0 || dx >= n || dy < 0 || dy >= n || mp[dx][dy] == 'X')break;
      else if (mp[dx][dy] == '1')return 0;
      dx += dir[i][0], dy += dir[i][1];
    }
  }
  return 1;
}
void dfs(int k)
{
  int i, j;
  for (i = 0; i < n; i++)
    for (j = 0; j < n; j++)
      if (check(i, j))
      {

        mp[i][j] = '1';
        dfs(k + 1);
        mp[i][j] = '.';
      }
  if (ans < k)
    ans = k;
}
int main()
{
  while (scanf("%d", &n)&&n)
  {
    ans = 0;
    for (int i = 0; i < n; i++)
    {
      for (int j = 0; j < n; j++)
      {
        scanf(" %c", &mp[i][j]);
      }
    }
    dfs(0);
    printf("%d\n", ans);
  }
}