zoj1002

#include <vector>
#include <iostream>
using namespace std;
int length,ops;
vector<vector<int> > city;
int openCount(int x,int y)
{
    int co=0;
    if(x>0&&city[x-1][y]!=0)co++;
    if(y>0&&city[x][y-1]!=0)co++;
    if(x<length-1&&city[x+1][y]!=0)co++;
    if(y<length-1&&city[x][y+1]!=0)co++;
    return co;
}
void setFlag(int x,int y)
{
    for(int s=x-1;s>=0;s--)
    {
        if(city[s][y]==0)break;
        else if(city[s][y]!=-2) {city[s][y]=-2;ops--;}
    }
    for(int s=y-1;s>=0;s--)
    {
        if(city[x][s]==0)break;
        else if(city[x][s]!=-2) {city[x][s]=-2;ops--;}
    }
    for(int s=x+1;s<length;s++)
    {
        if(city[s][y]==0)break;
        else if(city[s][y]!=-2) {city[s][y]=-2;ops--;}
    }
    for(int s=y+1;s<length;s++)
    {
        if(city[x][s]==0)break;
        else if(city[x][s]!=-2) {city[x][s]=-2;ops--;}
    }
}
int getFlag(int x,int y)
{
    int co=0;
    for(int s=x-1;s>=0;s--)
    {
        if(city[s][y]==0)break;
        else co++;
    }
    for(int s=y-1;s>=0;s--)
    {
        if(city[x][s]==0)break;
        else co++;
    }
    for(int s=x+1;s<length;s++)
    {
        if(city[s][y]==0)break;
        else co++;
    }
    for(int s=y+1;s<length;s++)
    {
        if(city[x][s]==0)break;
        else co++;
    }
    return co;
}
int main()
{
    while(cin>>length&&length!=0)
    {
    char c;
    ops=0;
    if(length==1)
    {
        cin>>c;
        if(c=='.')cout<<"1"<<endl;
        else cout<<"0"<<endl;
    }
    else
    {
        city.clear();
        city.resize(length,vector<int>(length));
        int count=0;
        int min_open,min_fl;
        int opc=0,flag=0;
        int x,y;
        for(int i=0;i<length;i++)
            for(int j=0;j<length;j++)
            {
                cin>>c;
                if(c=='.'){city[i][j]=1;ops++;}
                else city[i][j]=0;
            }
        while(ops!=0)
        {
            min_open=5;
            min_fl=16;
            for(int i=0;i<length;i++)
                for(int j=0;j<length;j++)
                {
                    if(city[i][j]==1)
                    {
                        opc=openCount(i,j);
                        flag=getFlag(i,j);
                        if((opc<min_open)||(opc==min_open&&flag<min_fl))
                        {min_fl=flag;min_open=opc;x=i;y=j;}
                    }
                }
            city[x][y]=-1;
            ops--;
            count++;
            setFlag(x,y);
        }
        cout<<count<<endl;
    }
    }
    return 0;
}

 虽然终于AC过去了,但其实还是失败的,因为我都不能证明自己的算法是正确的...大学时学得真是忘得差不多了,要好好补补算法的基础知识了~~下次写个心中有数的算法再AC一次!

I'm back! 

转载于:https://www.cnblogs.com/heqile/archive/2011/10/21/2220322.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值