HDU1045【贪心】

按照所影响的格子的个数从小到大排序,一个一个选。

也可以按照网络流的方法来做,具体参考http://www.cnblogs.com/Lnizei/p/4072122.htmlhttp://www.cnblogs.com/Lnizei/p/4072341.html

#include<cstdio>
#include<string>
#include<queue>
using namespace std;
const int NO=6;
struct X
{
    int i,j,s;
    bool operator <(const X &b)const{return s>b.s;}
}p[NO][NO],x;
char map[NO][NO];
bool mark[NO][NO];
int main()
{
    int n,i,j,k;
    for(i=1;i<=4;i++)
        for(j=1;j<=4;j++)
            p[i][j].i=i,p[i][j].j=j;
    while(scanf("%d",&n),n)
    {
        priority_queue<X> t;
        memset(map,'X',sizeof(map));
        for(i=1;i<=n;i++)
        {
            getchar();
            for(j=1;j<=n;j++)
            {
                p[i][j].s=0;
                mark[i][j]=0;
                map[i][j]=getchar();
            }
        }
        for(i=1;i<=n;i++)
            for(j=1;j<=n;j++)
                if(map[i][j]=='.')
                {
                    for(k=i-1;k>=0;k--)//纵向找端点
                        if(map[k][j]=='X')
                        {
                            k++;
                            break;
                        }
                    for(;k<=n;k++)
                        if(map[k][j]=='.')
                            p[i][j].s++;
                        else
                            break;
                    for(k=j-1;k>=0;k--)//横向找端点
                        if(map[i][k]=='X')
                        {
                            k++;
                            break;
                        }
                    for(;k<=n;k++)
                        if(map[i][k]=='.')
                            p[i][j].s++;
                        else
                            break;
                    t.push(p[i][j]);
                }
                else
                    mark[i][j]=1;
        int s=0;
        while(!t.empty())
        {
            x=t.top();
            t.pop();
            if(mark[x.i][x.j])
                continue;
            mark[x.i][x.j]=1;
            s++;
            for(k=x.i-1;k>=0;k--)//纵向找端点
                if(map[k][x.j]=='X')
                {
                    k++;
                    break;
                }
            for(;k<=n;k++)
                if(map[k][x.j]=='.')
                    mark[k][x.j]=1;
                else
                    break;
            for(k=x.j-1;k>=0;k--)//横向找端点
                if(map[x.i][k]=='X')
                {
                    k++;
                    break;
                }
            for(;k<=n;k++)
                if(map[x.i][k]=='.')
                    mark[x.i][k]=1;
                else
                    break;
        }
        printf("%d\n",s);
    }
    return 0;
}
View Code

 

posted @ 2014-11-03 22:17  L逆贼  阅读(121)  评论(0)    收藏  举报