POJ 1230 Pass-Muraille#贪心+vector迭代器用法

(~ ̄▽ ̄)~*

(注意下面代码中关于iterator的用法,此代码借鉴某大牛)

#include<iostream>
#include<cstdio>
#include<vector>
#include<cstring>
using namespace std;

struct Wall
{
    int row;//表示墙在哪行
    int left;
    int right;
};

int col[105];//保存每列的墙数
vector<Wall> wall;

int main()
{
    int t,n,k,ax,ay,bx,by;
    scanf("%d",&t);
    while(t--)
    {
        wall.clear();
        memset(col,0,sizeof(col));
        scanf("%d%d",&n,&k);
        int maxright=0;
        int cnt=0;
        while(n--)
        {
            scanf("%d%d%d%d",&ax,&ay,&bx,&by);
            if(ax>bx)
                swap(ax,bx);//有可能先输入墙的右端点
            if(bx>maxright)
                maxright=bx;

            Wall temp;
            temp.row=ay; temp.left=ax; temp.right=bx;
            wall.push_back(temp);
            for(int i=ax;i<=bx;i++)
                col[i]++;
        }
        int maxt;
        for(int i=0;i<=maxright;i++)
        {//前面maxright记录了所有墙中的最右端,这样遍历的时候,在maxright结束即可
            while(col[i]>k)
            {//遍历每列,当该列的墙数>k,说明需要删墙了
                vector<Wall>::iterator it=wall.begin();//遍历迭代器
                vector<Wall>::iterator iter;//临时迭代器
                maxt=0;
                while(it!=wall.end())
                {//把右边界最大(right大于maxt)的墙(用iter记录)删掉(erase vector元素wall中的第iter个元素)
                    if((*it).left<=i)
                    {
                        if((*it).right>maxt)
                        {
                            maxt=(*it).right;
                            iter=it;
                        }
                    }
                    it++;
                }
                for(int j=(*iter).left;j<=(*iter).right;j++)
                    col[j]--;//删掉墙相关的记录
                wall.erase(iter);//删掉墙
                cnt++;
            }
        }
        printf("%d
",cnt);
    }
    return 0;
}
原文地址:https://www.cnblogs.com/atmacmer/p/5210763.html