n快小方格产生的俄罗斯方块不同形状。
思路就是暴力打表。。如果n比较大,那就不知道了。。
根据上一个扩展一个,去重的话是通过旋转,然后对vector内容排序之后map标记
如果需要去处镜面对称的情况,还要再去处镜面对称
#include<bits/stdc++.h> using namespace std; #define ll long long #define pb push_back #define mp make_pair #define fi first #define se second #define all(v) v.begin(),v.end() #define mem(a) memset(a,0,sizeof(a)) #define pii pair<int,int> const int N = 2e5+4; const ll mod =1e9+7; const ll INF = 1e18+4; const double eps = 1e-7; int dx[4] = {0,0,1,-1}; int dy[4] = {1,-1,0,0}; int n; map< vector<pii>,ll>M; int vis[22][22]; vector<pii>tt; vector<pii>Find; vector<pii>gg; vector< vector<pii> >las; vector< vector<pii> >has; pii xuan(int x,int y,int p,int q){return mp(y-q+p,p-x+q);} void myswap(){ vector<pii>qw; qw.pb(mp(13,13)); for(int i=1;i<tt.size();++i){ qw.pb( xuan(tt[i].fi,tt[i].se,13,13) ); } gg=qw; } void Jing(vector<pii> st){ pii bi = st.back(); int dx = bi.fi+1; dx*=2; vector<pii>en; for(auto x:st){ en.pb(mp(dx-x.fi,x.se)); } sort(all(en)); Find.clear(); Find.pb(mp(0,0)); for(int i=1;i<en.size();++i){ Find.pb(mp(en[i].fi-en[0].fi,en[i].se-en[0].se)); } M[Find]=1; } int ans; bool invec(vector<pii> t,int a,int b){ for(auto x:t){if(x.fi==a && x.se==b)return true;}return false; } void get(){ for(auto x:las){ vector<pii>tmp = x; tt =tmp; for(auto m:tmp){ for(int i=0;i<4;++i){ int nx=m.fi+dx[i]; int ny=m.se+dy[i]; if( invec(tmp,nx,ny)==true)continue; tt=tmp; tt.pb(mp(nx,ny)); gg = tt; sort(all(gg)); Find.clear(); Find.pb(mp(0,0)); for(int i=1;i<gg.size();++i)Find.pb(mp(gg[i].fi-gg[0].fi,gg[i].se-gg[0].se)); if(M[Find]){ continue; } has.pb(tt); M[Find]=1; Jing(Find); for(int k=0;k<3;++k){ myswap(); tt = gg; sort(all(gg)); Find.clear(); Find.pb(mp(0,0)); for(int i=1;i<gg.size();++i)Find.pb(mp(gg[i].fi-gg[0].fi,gg[i].se-gg[0].se)); M[Find]=1; Jing(Find); } } } } las =has; has.clear(); return ; } int kans[]= {0,1,1,2,5,12,35,108,369,1285,4655,17073,63600}; int main(){ vector<pii>one; one.pb(mp(13,13)); las.pb(one); /*for(n=1;n<=11;++n){ get(); }*/ int mm; int t; cin>>t; while(t--){ int n; cin>>n; cout<<kans[n]<<endl; } return 0; }