1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121
| #include <iostream> #include <algorithm> #include <set> using namespace std;
struct Cell{ int x,y; Cell(int x=0,int y=0):x(x),y(y){} bool operator < (const Cell &A) const{ if(x==A.x) return y<A.y; else return x<A.x; } };
int dx[]={0,0,-1,1}; int dy[]={-1,1,0,0}; const int maxn=11; set<set<Cell>> poly[maxn]; int ans[maxn][maxn][maxn];
inline set<Cell> standard(const set<Cell> & temp){ int mx=temp.begin()->x; int my=temp.begin()->y; set<Cell> res; for(set<Cell>::iterator it=temp.begin();it!=temp.end();it++){ mx=min(mx,it->x); my=min(my,it->y); } for(set<Cell>::iterator it=temp.begin();it!=temp.end();it++){ res.insert(Cell(it->x-mx,it->y-my)); } return res; }
inline set<Cell> rotate(const set<Cell>& temp){ set<Cell> res; for(set<Cell>::iterator it=temp.begin();it!=temp.end();it++){ res.insert(Cell(it->y,-it->x)); } return standard(res); }
inline set<Cell> flip(const set<Cell>& temp){ set<Cell> res; for(set<Cell>::iterator it=temp.begin();it!=temp.end();it++){ res.insert(Cell(it->x,-it->y)); } return standard(res); }
void add(const set<Cell>& s,const Cell& cell){ set<Cell> t=s; t.insert(cell); t=standard(t); int n=t.size(); for(int i=0;i<4;i++){ if(poly[n].count(t)) return; t=rotate(t); } t=flip(t); for(int i=0;i<4;i++){ if(poly[n].count(t)) return; t=rotate(t); } poly[n].insert(t); }
void sol(){ set<Cell> start; start.insert(Cell(0,0)); poly[1].insert(start); for(int i=2;i<=10;i++){ for(set<set<Cell>>::iterator j=poly[i-1].begin();j!=poly[i-1].end();j++){ for(set<Cell>::iterator k=(*j).begin();k!=(*j).end();k++){ for(int l=0;l<4;l++){ int nx=k->x+dx[l]; int ny=k->y+dy[l]; Cell t(nx,ny); if(!j->count(t)) add(*j,t); } } } } for(int i=1;i<maxn;i++){ for(int w=1;w<maxn;w++){ for(int h=1;h<maxn;h++){ int cnt=0; for(set<set<Cell>>::iterator it=poly[i].begin();it!=poly[i].end();it++){ int mx=0,my=0; for(set<Cell>::iterator it2=it->begin();it2!=it->end();it2++){ mx=max(mx,it2->x); my=max(my,it2->y); } if(min(mx,my)<min(h,w)&&max(mx,my)<max(h,w)) cnt++; } ans[i][w][h]=cnt; } } } }
int main(){ ios::sync_with_stdio(false); cin.tie(0); sol(); int h,w,n; while(cin>>n>>w>>h){ if(n==1) { cout << 1 << endl; continue; } cout << ans[n][w][h] << endl; } return 0; }
|