UVA - 1602 Lattice Animals

题目链接

这道题……真的小细节太多了,做的十分头痛。贴一篇博文吧,他讲的非常细致。

AC代码:

#include <iostream>
#include <cstring>
#include <cstdio>
#include <set>
using namespace std;
#define ssit set< set<Cell> >::iterator
#define sit set<Cell>::iterator
struct Cell
{
    int x,y;
    Cell(int x=0,int y=0):x(x),y(y){};
    bool operator < (const Cell &t) const
    {
        if(x==t.x) return y<t.y;
        return x<t.x;
    }
};
int dx[]={1,-1,0,0};
int dy[]={0,0,1,-1};
set<set<Cell> >poly[12];
int ans[12][12][12];
set<Cell> standard(const set<Cell>& temp)
{
    int minx=temp.begin()->x,miny=temp.begin()->y;
    sit it;
    for(it=temp.begin();it!=temp.end();it++)
    {
        minx=min(minx,it->x);
        miny=min(miny,it->y);
    }
    set<Cell> ret;
    for(it=temp.begin();it!=temp.end();it++)
        ret.insert(Cell(it->x-minx,it->y-miny));
    return ret;
}

set<Cell> rotate(const set<Cell> &temp)
{
    set<Cell>ret;
    sit it;
    for(it=temp.begin();it!=temp.end();it++)
        ret.insert(Cell(it->y,-it->x));
    return standard(ret);
}

set<Cell> flip(const set<Cell> &temp)
{
    set<Cell> ret;
    sit it;
    for(it=temp.begin();it!=temp.end();it++)
        ret.insert(Cell(it->x,-it->y));
    return standard(ret);
}

void add(const set<Cell> &s,const Cell & New)
{
    set<Cell> temp=s;
    temp.insert(New);
    temp=standard(temp);
    int n=temp.size();
    for(int i=0;i<4;i++)
    {
        if(poly[n].count(temp))return;
        temp=rotate(temp);

    }
    temp=flip(temp);
    for(int i=0;i<4;i++)
    {
        if(poly[n].count(temp)) return;
        temp=rotate(temp);
    }
    poly[n].insert(temp);
}
void gernerate()
{
    set<Cell> fir;
    fir.insert(Cell(0,0));
    poly[1].insert(fir);
    for(int n=2;n<=10;n++)
        for(ssit it=poly[n-1].begin();it!=poly[n-1].end();it++)
            for(sit it2=(*it).begin();it2!=(*it).end();it2++)
                for(int i=0;i<4;i++)
                {
                    int x=it2->x+dx[i];
                    int y=it2->y+dy[i];
                    Cell temp(x,y);
                    if(!it->count(temp)) add(*it,temp);
                }

    for(int n=1;n<12;n++)
        for(int w=1;w<12;w++)
            for(int h=1;h<12;h++)
            {
                int cnt=0;
                for(ssit it=poly[n].begin();it!=poly[n].end();it++)
                {
                    int maxx=0,maxy=0;
                    for(sit it1=(*it).begin();it1!=(*it).end();it1++)
                    {
                        maxx=max(maxx,it1->x);
                        maxy=max(maxy,it1->y);
                    }
                    if(min(maxx,maxy)<min(h,w)&&max(maxx,maxy)<max(h,w))
                        cnt++;
                }
                ans[n][h][w]=cnt;
            }



}
int main()
{
    gernerate();
    int h,w,n;
    while(cin>>n>>w>>h)
    {
        if(n==1) {puts("1");continue;}
        cout<<ans[n][w][h]<<endl;
    }
    return 0;
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值