Problem 1136 : Polygonal Line Search

keyword

幾何 C++

概要

直線から構成された図形が与えられる。合同な図形を判定する問題。直線はすべてX or Y軸に平行。
端点を原点に平行移動して回転させてやればよい。

vector<pair<int,int> > rot(vector<pair<int,int> > ps){
    int i, s=SZ(ps);
    REP(i,s){
        swap(ps[i].first, ps[i].second);
        ps[i].first *= -1;
    }
    REP(i,s){
        ps[s-1-i].first  -= ps[0].first;
        ps[s-1-i].second -= ps[0].second;
    }
    return ps;
}

int main(){
    int n, m, i, j, k, x, y;

    while(scanf("%d",&n)){
        if(!n) break;
        scanf("%d",&m);
        vector< pair<int,int> > origin;
        vector<int> ans;
        vector< vector< vector<pair<int, int> > > > polys(n);
        REP(i,m){
            scanf("%d%d",&x,&y);
            origin.PB(MP(x,y));
        }
        REP(i,m){
            origin[m-1-i].first  -= origin[0].first;
            origin[m-1-i].second -= origin[0].second;
        }

        REP(i,n){
            scanf("%d",&m);
            polys[i].PB(vector< pair<int, int> >());
            REP(j,m){
                scanf("%d%d",&x,&y);
                polys[i][0].PB(MP(x,y));
            }
            REP(j,3) polys[i].PB(rot(polys[i].back()));
            polys[i].PB(polys[i][0]);
            reverse(polys[i].back().begin(), polys[i].back().end());
            REP(j,m){
                polys[i].back()[m-1-j].first -= polys[i].back()[0].first;
                polys[i].back()[m-1-j].second-= polys[i].back()[0].second;
            }
            REP(j,3) polys[i].PB(rot(polys[i].back()));
        }

        REP(i,n){
            REP(k,4){
                origin = rot(origin);
                REP(j,8)if(polys[i][j] == origin) goto end;
            }
end:;
            if(j<8) ans.PB(i);
        }
        REP(i,SZ(ans)){
            printf("%d\n",ans[i]+1);
        }
        printf("+++++\n");
    }

    return 0;
}