uva1602

打表加暴力搜索 看劉汝佳的代碼照著寫的
開始的時候想用二維數(shù)組表示Polyomino的 但是后面用這個數(shù)據(jù)結(jié)構(gòu)根本就無法寫出公式
看了這邊的代碼知道選擇結(jié)構(gòu)的問題 二維數(shù)組可變性實在太小了(但是確實很好表達逃)
那用結(jié)構(gòu)題刷過的這種題好像是uva1601把 剛開始也是用結(jié)構(gòu)體洋洋灑灑寫了一個晚上 后面發(fā)現(xiàn)不僅慢還有錯。。。(因為沒有用二進制表示坐標。。。。。。)
代碼就不寫注釋了。。。因為實在很裸。。。。

#include <cstdio>
#include <set>
#include <cstring>
#include <algorithm>
#include <iostream>
using namespace std;

const int N = 10;
int ans[N+1][N+1][N+1];
int n, w, h;
struct Cell{
    int x,y;
    Cell(int xx = 0, int yy = 0) : x(xx), y(yy){
    }
    bool operator < (const Cell& rhs) const {
        return x < rhs.x || (x == rhs.x && y < rhs.y); 
    }
};
typedef set<Cell> Polyomino;
typedef set<Polyomino> Polys;
Polys polysnum[N+1];
const int dx[] = {1,-1,0,0};
const int dy[] = {0,0,1,-1};
Polyomino normalize(const Polyomino& p){
    Polyomino newp;
    int minX = (p.begin())->x;
    int minY = (p.begin())->y;
    for( Polyomino::const_iterator i = p.begin(); i != p.end(); i++){
        minX = min(minX, i->x);
        minY = min(minY, i->y);
    }
    for( Polyomino::iterator i = p.begin(); i != p.end(); i++){
        newp.insert(Cell( i->x - minX, i->y - minY ));
    }
    return newp;
}
Polyomino rotate(const Polyomino& p){
    Polyomino newp;
    for( Polyomino::iterator i = p.begin(); i != p.end(); i++){
        newp.insert(Cell( i->y, -i->x ));
    }
    return normalize(newp);
}
Polyomino flip(const Polyomino& p){
    Polyomino newp;
    for( Polyomino::iterator i = p.begin(); i != p.end(); i++){
        newp.insert(Cell( i->x, -i->y ));
    }
    return normalize(newp);
}

void put_cell(const Polyomino& p, const Cell& newCell){
    Polyomino newp = p;
    newp.insert( newCell );
    newp = normalize(newp);
    int nn = newp.size();
    for(int i = 0; i < 4; i++){
        if(polysnum[nn].count(newp) != 0) return;
        newp = rotate(newp);
    }
    newp = flip(newp);
    for(int i = 0; i < 4; i++){
        if(polysnum[nn].count(newp) != 0) return;
        newp = rotate(newp);
    }
    polysnum[nn].insert(newp);
}
void generate(){
    Polyomino p;
    p.insert(Cell(0,0));
    polysnum[1].insert(p);
    for(int k = 2; k <= N; k++){
        for(Polys::iterator iter_polys = (polysnum[k-1]).begin(); iter_polys != (polysnum[k-1]).end(); iter_polys++){
            for(Polyomino::iterator iter_cells = (*iter_polys).begin(); iter_cells != (*iter_polys).end(); iter_cells++){
                for(int dir = 0; dir < 4; dir++){
                    Cell newCell( iter_cells->x + dx[dir], iter_cells->y + dy[dir]);
                    if( iter_polys->count(newCell) == 0 ){
                        put_cell( *iter_polys, newCell);
                    }
                }
            }
        }
    }
    for(int i = 1; i <= N; i++){
        for(int j = 1; j <= N; j++){            //w
            for(int k = 1; k <= N; k++){        //h
                //cout<<"n "<<i<<endl;
                int cnt = 0;
                for(Polys::iterator iter_polys = (polysnum[i]).begin(); iter_polys != (polysnum[i]).end(); iter_polys++){
                    int maxX = 0;
                    int maxY = 0;
                    for(Polyomino::iterator iter_cells = (*iter_polys).begin(); iter_cells != (*iter_polys).end(); iter_cells++){
                        maxX = max(maxX, iter_cells->x);
                        maxY = max(maxY, iter_cells->y);
                    }
                    if(min(maxX, maxY) < min(j, k) && max(maxX, maxY) < max(j, k)){
                        cnt++;
                        //cout<<i<<" "<<j<<" "<<k<<maxX<<" "<<maxY<<endl;
                    }
                }
                ans[i][j][k] = cnt;
            }
        }
    }
}
int main(){
    generate();
    while(scanf("%d %d %d", &n, &w, &h) == 3){
        printf("%d\n", ans[n][w][h]);
    }
    return 0;
} 
最后編輯于
?著作權歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關閱讀更多精彩內(nèi)容

  • Android 自定義View的各種姿勢1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 178,983評論 25 709
  • 親愛的,如果時光可以倒流,我愿回到七歲之前,那時候我們無憂無慮。記得每個假期都是你和我度過的,那時候我們不用擔心未...
    莫拾荒閱讀 736評論 2 2
  • 有時候想想,不都是人嗎,至于這樣喜歡過去喜歡過來的嗎?本就無意義的事,可我們賦予了它太多的情感
    x1x閱讀 116評論 0 0
  • 很短,美好!
    半瓶水的生活閱讀 232評論 0 0
  • 風靜香云結(jié),書裁雨掩門。 茶湯猶未淡,已是近黃昏。
    江南煙雨閱讀 240評論 1 4

友情鏈接更多精彩內(nèi)容