【刘汝佳书】例题5-12 UVA221(离散化、排序)

【2019.4.6】
这道题看了书上的思路,本以为稳了
结果WA了四次,
因为没有把结果按照从西到东,从南到北排序
PE了一次,因为最后一个答案后面没有空行,最后一个数字后面没有空格

感觉自己脑子真的不清楚,不知道自己在写些什么,
读题很差,组织代码的能力更差,很多时候都是凭本能写代码,
从例题5-10做到例题5-12,真的要自闭了,
这三道测例不多,就看出debug能力几乎为0,没有测例就根本一头雾水,不知道哪里错了

#include <iostream>
#include <vector>
#include <algorithm>
#include <set>

using namespace std;

typedef struct node {
    int num;
    double x;
    double y;
    double xr;
    double h;
}building;

vector<building> city;
vector<double> allx;
vector<building> citybyy;
set<int> printed;
vector<building> output;

bool cmp(building a, building b)
{
    if(a.x != b.x) return a.x < b.x;
    return a.y < b.y;
}
bool cmp2(building a, building b)
{
    return a.y < b.y;
}

int main()
{
    int map_num = 0;
    int bui_num;
    double ix, iy, iw, id, ih;
    while(cin>>bui_num && bui_num) {
        //初始化
        city.clear();
        allx.clear();
        printed.clear();
        output.clear();

        //输入building
        for(int i=1; i<=bui_num; i++) {
            cin>>ix>>iy>>iw>>id>>ih;

            building* b = (building*)malloc(sizeof(building));
            b->num = i;
            b->x = ix;
            b->y = iy;
            b->xr = b->x + iw;
            b->h = ih;

            city.push_back(*b);
            allx.push_back(b->x);
            allx.push_back(b->xr);
        }

        //排序并去重
        sort(city.begin(), city.end(), cmp);
        sort(allx.begin(), allx.end());
        vector<double>::iterator new_end = unique(allx.begin(), allx.end());
        allx.erase(new_end, allx.end());

        //遍历每个区间
        double midx;
        for(int i=0; i<allx.size()-1; i++) {
            midx = (allx[i] + allx[i+1])/2.0;
            citybyy.clear();
            //先把在x区间内的找出来
            for(int j=0; j<city.size(); j++) {
                if(city[j].x < midx && city[j].xr > midx)
                    citybyy.push_back(city[j]);
                else if(city[j].x > midx) break;
            }

            //按照y值排序
            sort(citybyy.begin(), citybyy.end(), cmp2);

            //按y值从小到大遍历,寻找不被遮挡的
            double curh = 0.0;
            for(int j=0; j<citybyy.size(); j++) {
                if(citybyy[j].h > curh) {
                    if(!printed.count(citybyy[j].num)) {
                        output.push_back(citybyy[j]);
                        printed.insert(citybyy[j].num);
                    }
                    curh = citybyy[j].h;
                }
            }
        }

        //把答案排序
        sort(output.begin(), output.end(), cmp);

        //输出答案
        if(map_num) cout<<endl;
        printf("For map #%d, the visible buildings are numbered as follows:\n", ++map_num);
        printf("%d", (output[0].num));
        for(int i=1; i<output.size(); i++)
            printf(" %d", (output[i].num));
        cout<<endl;
    }
    return 0;
}

猜你喜欢

转载自blog.csdn.net/qq_41727666/article/details/89057812