zoj1002 Fire Net

#include<iostream>
#include<string>
#include<cstring>
#include<algorithm>
using namespace std;
string map[5];
int ANS,n;
int wall[5][5],mark[5][5];
bool check(int x,int y)
{
      for(int i=x-1;i>=0;i--)
      {
          if(mark[i][y])return 0;
          if(wall[i][y])break;
      }
      for(int j=y-1;j>=0;j--)
      {
          if(mark[x][j])return 0;
          if(wall[x][j])break;
      }
      for(int i=x+1;i<n;i++)
      {
          if(mark[i][y])return 0;
          if(wall[i][y])break;
      }
      for(int j=y+1;j<n;j++)
      {
          if(mark[x][j])return 0;
          if(wall[x][j])break;
      }
      return 1;
}
void DFS(int num)
{
    if(ANS<num)ANS=num;
    for(int i=0;i<n;i++)//相当于对每个格子进行全排列
        for(int j=0;j<n;j++)
            if(!wall[i][j]&&!mark[i][j]&&check(i,j))
            {
                mark[i][j]=1;
                DFS(num+1);
                mark[i][j]=0;
            }
}
int main()
{
     
    while(cin>>n&&n)
    {
        ANS=0;
        memset(wall,0,sizeof(wall));
        memset(mark,0,sizeof(mark));
        for(int i=0;i<n;i++)
        {
            cin>>map[i];
            for(int j=0;j<n;j++)
                if(map[i][j]=='X')
                {
                    wall[i][j]=1;
                }
        }
        DFS(0);
        cout<<ANS<<endl;
    }
}
posted on   4.5.6  阅读(193)  评论(0编辑  收藏  举报
点击右上角即可分享
微信分享提示