这道题……真的小细节太多了,做的十分头痛。贴一篇博文吧,他讲的非常细致。
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;
}