#include using namespace std; const int dx[4] = { 0,0,1,-1}, dy[4] = {-1,1,0, 0}; vector > sol,aux; map, int> M; vector > > V; #define TableSize 30 #define middleSize TableSize/2 int used[TableSize][TableSize]; char tabla[TableSize][TableSize]; int Size = 14,avem; const int MOD1 = 1000000000 + 9; const int MOD2 = 666013; pair hashCode(const vector> &vpii) { pair code = make_pair(0, 0); for (auto p : vpii) { p.first += 1000; p.second += 1000; code.first = (1LL * code.first * 137) % MOD1; code.first = (1LL * code.first + p.first) % MOD1; code.first = (1LL * code.first * 91) % MOD1; code.first = (1LL * code.first + p.second) % MOD1; code.second = (1LL * code.second * 137) % MOD2; code.second = (1LL * code.second + p.first) % MOD2; code.second = (1LL * code.second * 91) % MOD2; code.second = (1LL * code.second + p.second) % MOD2; } return code; } void back(int x,int y,int k) { if(k == Size){ /// we generated a shape aux = sol; pair best = aux[0]; for(int i = 0; i < Size; ++i) if(best > aux[i]) best = aux[i]; /// we search the down left corner for(int i = 0; i < Size; ++i){ /// we fix the corner as reference point aux[i].first -= best.first; aux[i].second -= best.second; } sort(aux.begin(),aux.end()); /// le sortam pe nenorocitele astea /// ca sa fie mereu in aceeasi ordine relativa pair hcode = hashCode(aux); if (M[hcode] == 0) avem++; M[hcode] = 1; return; } for(int i = 0; i <= 3; ++i){ int _newx,_newy; _newx = x + dx[i]; _newy = y + dy[i]; if(!used[_newx][_newy]){ sol[k] = {_newx,_newy}; used[_newx][_newy] = 1; back(_newx,_newy,k+1); used[_newx][_newy] = 0; } } } int N,cnt; void Read() { scanf("%d",&N); for(int i = 0; i < N; ++i) scanf("%s",tabla[i]); } int afara(int x,int y) { if(0 <= x && x < N && 0 <= y && y < N) return 0; return 1; } int main() { cin >> Size; sol.resize(Size); sol[0] = {middleSize,middleSize}; used[middleSize][middleSize] = 1; back(middleSize,middleSize,1); /*for(auto it : M) { vector > crt = it.first; pair best = crt[0]; for(int i = 0; i < Size; ++i) { crt[i].first -= best.first; crt[i].second -= best.second; ///used[crt[i].first][crt[i].second] = 1; } V.push_back(crt); ///printf("dadada\n"); } printf("%d\n",V.size()); */ printf("%d\n", static_cast(M.size())); return 0; }