1. 程式人生 > >ZOJ1002 Fire Net

ZOJ1002 Fire Net

#include<stdio.h>

#define true 1
#define false 0

char map[4][4];
int vis[4][4];
int max,count;
int n;

int is_ok(int a,int b)
{
	if(map[a][b]=='X')
		return false;
	if(vis[a][b]==1)
		return false;

    int i,j;
    i=a,j=b;
    j++;
    while(j<n&&map[i][j]!='X')
    {
        if(vis[i][j]==1)
            return false;
        j++;
    }
    i=a,j=b;
    j--;
    while(j>=0&&map[i][j]!='X')
    {
        if(vis[i][j]==1)
            return false;
        j--;
    }
    i=a,j=b;
    i++;
    while(i<n&&map[i][j]!='X')
    {
        if(vis[i][j]==1)
            return false;
        i++;
    }
    i=a,j=b;
    i--;
    while(i>=0&&map[i][j]!='X')
    {
        if(vis[i][j]==1)
            return false;
        i--;
    }

	return true;
}

void shuaxin_max()
{
	if(max<count)
		max=count;
}

void dfs(int a,int b)
{
	if(is_ok(a,b)==true)
	{
		vis[a][b]=1;
		int temp=++count;
		shuaxin_max();

		int i,j;
		for(i=0;i<n;i++)
		{
			for(j=0;j<n;j++)
			{
				if(i!=a&&j!=b)
				{
					dfs(i,j);
					count=temp;
				}
			}
		}
		vis[a][b]=0;
	}

}

int main(void)
{
    while(scanf("%d",&n)!=EOF && n!=0)
    {
    	getchar();
        int i,j;
        for(i=0;i<n;i++)
        {
            for(j=0;j<n;j++)
            {
                scanf("%c",&map[i][j]);
                vis[i][j]=0;
            }
            getchar();
        }

		max=count=0;
		for(i=0;i<n;i++)
		{
			for(j=0;j<n;j++)
			{
			    count=0;
				dfs(i,j);
			}
		}

		printf("%d\n",max);
    }
}