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 2011-05-02 23:31  4.5.6  阅读(188)  评论(0编辑  收藏  举报