#include <iostream>
#include <istream>
#include <sstream>
#include <vector>
#include <stack>
#include <list>
#include <map>
#include <set>
#include <deque>
#include <queue>
#include <cstring>
#include <unordered_map>
#include <unordered_set>
#include <algorithm>
#include <numeric>
#include <chrono>
#include <ctime>
#include <cmath>
#include <cctype>
#include <string>
#include <cstdio>
#include <iomanip>
#include <thread>
#include <mutex>
#include <condition_variable>
#include <functional>
#include <iterator>
using namespace std;
typedef pair<int, int> Cell;//单元格
typedef set<Cell> Squares; //方块
const int maxn = 11,mmin = -10086,mmax = 10086, Dirs[4][2] = { { 1, 0 }, { -1, 0 }, { 0, 1 }, { 0, -1 } };
set<Squares> all[maxn];
int ans[maxn][maxn][maxn],n,w,h;
//移动到原点
Squares MoveToOrigin(const Squares &in){
Squares ret;
int minx = mmax, miny = mmax;
for (auto it = in.begin(); it != in.end(); it++){
minx = min(it->first, minx);
miny = min(it->second, miny);
}
for (auto it = in.begin(); it != in.end(); it++){
ret.insert(make_pair(it->first - minx, it->second - miny));
}
return ret;
}
//旋转
Squares Rotate(const Squares &in)
{
Squares ret;
for (auto it = in.begin(); it != in.end(); it++){
ret.insert(make_pair(it->second, -it->first));
}
return MoveToOrigin(ret);
}
//翻转
Squares Filp(const Squares &in){
Squares ret;
for (auto it = in.begin(); it != in.end(); it++){
ret.insert(make_pair(it->first, -it->second));
}
return MoveToOrigin(ret);
}
void CheckAddCell(const Squares &in,const Cell &ReadAdd)
{
Squares ns = in;
ns.insert(ReadAdd);
ns = MoveToOrigin(ns);
int CurCnt = ns.size();
for (int i = 0; i < 4; i++){
if (all[CurCnt].count(ns)) return;
ns = Rotate(ns);
}
ns = Filp(ns);
for (int i = 0; i < 4; i++){
if (all[CurCnt].count(ns)) return;
ns = Rotate(ns);
}
all[CurCnt].insert(ns);
}
pair<int, int> GetMinMax(const Squares &in)
{
int maxx = mmin, maxy = mmin;
for (auto it = in.begin(); it != in.end(); it++){
maxx = max(it->first, maxx);
maxy = max(it->second, maxy);
}
return make_pair(maxx, maxy);
}
void GetResult()
{
Squares sq;
sq.insert(make_pair(0, 0));
all[1].insert(sq);
for (int cnt = 2; cnt < maxn; cnt++){
//在以前的基础上加一个单元格
set<Squares> & s = all[cnt - 1];
for (auto it = s.begin(); it != s.end(); it++){
for (auto it2 = it->begin(); it2 != it->end(); it2++){
for (int i = 0; i < 4; i++){
Cell q(it2->first + Dirs[i][0], it2->second + Dirs[i][1]);
if (!it->count(q)) CheckAddCell(*it, q);
}
}
}
}
for (int i = 1; i < maxn; i++){
for (int j = 1; j < maxn; j++){
for (int k = 1; k < maxn; k++){
int cnt = 0;
for (auto it = all[i].begin(); it != all[i].end(); it++){
pair<int, int> t = GetMinMax(*it);
if (min(t.first, t.second) < min(j, k) && max(t.first, t.second) < max(j, k)) ++cnt;
}
ans[i][j][k] = cnt;
}
}
}
}
int main()
{
GetResult();
while (cin >> n >> w >> h){
cout << ans[n][w][h] << endl;
}
return 0;
}
07-15
05-20
“相关推荐”对你有帮助么?
-
非常没帮助
-
没帮助
-
一般
-
有帮助
-
非常有帮助
提交