hdu 1045 Fire Net

//暴搜也0MS,因为数据只有4*4,不过更牛的做法是转为二分图的最大匹配,暂缺。。
#include <stdio.h>
#include <string.h>

#define MAXN 5

int n,ans,cnt;

char map[MAXN][MAXN];

bool isvalid(int x,int y)
{
    map[x][y]='H';
    int i,j;
    bool h=false;
    for(j=0; j<n; j++)
    {
        if(map[x][j]=='H')
        {
            if( h )
            {
                map[x][y]='.';
                return false;
            }
            h=true;
        }
        if(map[x][j]=='X')
            h=false;
    }
    h=false;
    for(i=0; i<n; i++)
    {
        if(map[i][y]=='H')
        {
            if( h )
            {
                map[x][y]='.';
                return false;
            }
            h = true;
        }
        if(map[i][y]=='X')
            h=false;
    }
    return true;
}

void dfs(int r,int c)
{
    if(r==n)
    {
        if(cnt>ans) ans=cnt;
        return;
    }
    if(c==n)
    {
        if(cnt>ans) ans=cnt;
        dfs(r+1,0);
        return;
    }
    for(int j=c; j<n; j++)
    {
        if(map[r][j]=='.' && isvalid(r,j))
        {
            map[r][j]='H';
            cnt++;
            dfs(r,j+1);
            map[r][j]='.';
            cnt--;
        }
    }
    dfs(r+1,0);
}

int main()
{
    int i;
    while(scanf("%d",&n),n)
    {
        ans=cnt=0;
        for(i=0; i<n; i++) scanf("%s",map[i]);

        dfs(0,0);
        printf("%d\n",ans);
    }
    return 0;
}

 

 

posted @ 2010-08-24 21:43  菜到不得鸟  阅读(433)  评论(0)    收藏  举报