PKU POJ 1414 Life Line 搜索

题目很简单,就是在题目给点的区域划分下,判定哪些个区域和0相接,以及计算每个区域的节点数。

搜索可以做,要注意搜索方向的设置。
#include<iostream>
using namespace std;
int n,c,s[15][15];
bool flag[15][15];
int dir[6][2]={{-1,0},{-1,-1},{0,-1},{1,1},{0,1},{1,0}};
inline bool judge(int x,int y)
{
    return x>0&&y>0&&x<=n&&y<=x;
}
bool dfs(int x,int y,int& cnt)//return true if adjacent to 0
{
    flag[x][y]=true;
    ++cnt;
    bool f=false;
    int i,j;
    for (i=0;i<6;++i)
    {
        int x1=x+dir[i][0],y1=y+dir[i][1];
        if (judge(x1,y1))
        {
            if (s[x1][y1]==0)
                f=true;
            else if (s[x1][y1]==s[x][y]&&!flag[x1][y1])
                if(dfs(x1,y1,cnt))
                    f=true;
        }
    }
    return f;
}
int cal(int x,int y)
{
    s[x][y]=c;
    int i,j,total=0;
    memset(flag,false,sizeof(flag));
    for (i=1;i<=n;++i)
        for(j=1;j<=i;++j)
            if (!flag[i][j]&&s[i][j]!=0)
            {
                int tmp=0;
                if (!dfs(i,j,tmp))
                {
                    if (s[i][j]==c)
                        total-=tmp;
                    else
                        total+=tmp;
                }
            }
    s[x][y]=0;
    return total;
}
int main()
{
    int i,j,max;
    while (scanf("%d%d",&n,&c)!=EOF&&!(n==0&&c==0))
    {
        for (i=1;i<=n;++i)
            for(j=1;j<=i;++j)
                scanf("%d",&s[i][j]);
        max=-1000000;
        for (i=1;i<=n;++i)
            for (j=1;j<=i;++j)
                if (s[i][j]==0)
                {
                    int tmp=cal(i,j);
                    if (tmp>max)
                        max=tmp;
                }
        printf("%d\n",max);
    }
    return 0;
}

 

posted on 2013-03-04 18:09  Deller  阅读(170)  评论(0)    收藏  举报

导航