现在的位置: 首页 > 综合 > 正文

hdu 1045 Fire Net

2013年10月11日 ⁄ 综合 ⁄ 共 855字 ⁄ 字号 评论关闭

/*
    hdu 1045 

    搜索题加贪心思想

对于找最大xx的题,要么用广搜,要么就把每个坐标都作为第一个点搜索一次 

*/
#include <iostream>
#include <cstdio>
#define maxn 6
using namespace std;
int sum,n;
char map[maxn][maxn];
int find(int x,int y)       //看该点是否能够放O
{
    if(map[x][y]!='.')
        return 0;

    for(int i=x-1;i>=1;i--)     //纵向检索是否不合题意
    {
        if(map[i][y]=='X')
            break;
        if(map[i][y]=='O')
            return 0;
    }
    for(int i=y-1;i>=1;i--)     //纵向检索
    {
        if(map[x][i]=='X')
            break;
        if(map[x][i]=='O')
            return 0;
    }
    return 1;
}
int dfs(int p, int s)
{
    if(p==n*n)
    {
        sum=sum>s?sum:s;
        return 0;
    }
    int a=p/n+1;        //求纵坐标
    int b=p%n+1;        //求横坐标
    if(find(a,b))
    {
        map[a][b]='O';
        dfs(p+1,s+1);
        map[a][b]='.';
    }
    dfs(p+1,s);
    return 0;
}
int main()
{
    while(scanf("%d",&n),n!=0)
    {
        for(int i=1;i<=n;i++)
            for(int j=1;j<=n;j++)
                cin>>map[i][j];

        sum=-1;
        dfs(0,0);           //分别代表在检索第几个点和共放置多少个O;
        printf("%d\n",sum);
    }
}

抱歉!评论已关闭.