60分求助
查看原帖
60分求助
767779
BD_AZZR_CN楼主2024/7/24 17:00

这是一个很早交的代码,大概是输入三角形后按行劈开,加入到数组中,再遍历每个数组,把长条劈开,判断三角形有没有重叠,然后计数

#include <iostream>
#include <set>
using namespace std;
struct block{
    int line;
    int start;
    int len;
    bool operator<(const block& other) const{
        if(line != other.line){
            return line > other.line;
        }
        if(start != other.start){
            return start < other.start;
        }
        return len < other.len;
    }
    block(int line,int start,int len): line(line),start(start),len(len) {};
};
/*struct line_b{
    int start,len;
};*/
struct cicyle{
    int x,y;
    bool operator<(const cicyle& other) const{
        if(y != other.y) return y > other.y;
        return x > other.x;
    }
    cicyle(int x,int y): x(x),y(y) {};
};
struct little_block{
    int x;
    bool is_cicyle;//false->is a block;
    little_block(int x, bool iscicyle): x(x), is_cicyle(iscicyle) {};
    bool operator<(const little_block& other) const{
        if(x != other.x){
            return x < other.x;
        }
        return is_cicyle < other.is_cicyle;
    }
};
set<block> block_set;
set<cicyle> cicyle_set;
//set<line_b> little_block_set;
set<little_block> little_block_set;
//x横y竖
long long ans = 0;
void slove(){
    /*int last = INT_MIN;
    for(k:little_block_set){
        if(k != last){
            last = k;
            printf("%d ",k);
            ans++;
        }
    }
    printf("\n");
    little_block_set.clear();*/
    //old code
    little_block last = little_block(-2147483648,false);
    bool is_a_cicyle = false;
    for(little_block k:little_block_set){
        if(last.x != k.x){//不在同一个位置
            if(k.is_cicyle){
                ans++;
            }
            else{
                ans += 2;
            }
            // printf("%d-%d\n",k.x,is_a_cicyle);
            is_a_cicyle = false;
            
        }
        // else{//在同一个位置
        is_a_cicyle = k.is_cicyle | is_a_cicyle;
        last = k;
    }
    little_block_set.clear();
    // printf("============================\n");
}
// void to_next(auto &k){
//     k = next(k);
// }
int main(){
    int n,x,y,len;
    cin >> n;
    for(int i = 1; i <= n; i++){
        cin >> x >> y >> len;
        for(int j = 1; j <= len; j++){
            if(len - j != 0)block_set.insert(block(y+j-1,x,len-j));
            cicyle_set.insert(cicyle(x+j-1,y+len-j));
        }
    }
    // printf("----------------------------------------------------\n");
    int last_line = -2147483648;
    /*for(auto k:block_set){
        if(last_line == k.line){
            for(int T = 0; T < k.len; T++){
                little_block_set.insert(little_block(k.start+T,false));
                //printf("add! %d\n",k.line);
            }line_b{k.start,k.len}
        }
        else{
            slove();
            last_line = k.line;
            for(int T = 0; T < k.len; T++){
                little_block_set.insert(little_block(k.start+T,false));
                //printf("add! %d\n",k.line);
            }
        }
    }*/
    std::set<cicyle>::iterator cicyle_iter = cicyle_set.begin();
    std::set<block>::iterator block_iter = block_set.begin();
    while(cicyle_iter != cicyle_set.end() && block_iter != block_set.end()){
        //add cicyle
        while(cicyle_iter->x == last_line){
            little_block_set.insert(little_block(cicyle_iter->y,true));
            cicyle_iter++;
        }
        //add block
        while(block_iter->line == last_line){
            for(int T = 0; T < block_iter->len; T++){
                little_block_set.insert(little_block(block_iter->start+T,false));
                //printf("add! %d\n",k.line);
            }
            block_iter++;
        }
        //done add a line
        slove();
        last_line = min(cicyle_iter->x,block_iter->line);
    }
    slove();
    // printf("%d\ncicyle:%d",ans,cicyle_set.size());
    /*for(auto k:cicyle_set){
        printf("%d %d\n",k.y,k.x);
    }*/
    cout << ans / 2.0;
}

如果有好心人看到的话尽力而为,我会尽快再写一版

2024/7/24 17:00
加载中...