【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;
}