#include <cstdio>
#include <cstring>
#define N 3
#define DIGIT N*N
#define THRESHOLD 4
using namespace std;
bool vis[DIGIT + 1];
int dp[DIGIT + 1][1<<(DIGIT + 1)][DIGIT + 1];
int ban[DIGIT + 1][DIGIT + 1] = {
{0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
{0, 0, 0, 2, 0, 0, 0, 4, 0, 5},
{0, 0, 0, 0, 0, 0, 0, 0, 5, 0},
{0, 2, 0, 0, 0, 0, 0, 5, 0, 6},
{0, 0, 0, 0, 0, 0, 5, 0, 0, 0},
{0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
{0, 0, 0, 0, 5, 0, 0, 0, 0, 0},
{0, 4, 0, 5, 0, 0, 0, 0, 0, 8},
{0, 0, 5, 0, 0, 0, 0, 0, 0, 0},
{0, 5, 0, 6, 0, 0, 0, 8, 0, 0}
};
int dfs(int len, int pre, int status, bool is_zero) {
if(len <= 0) return 1;
if(!is_zero && dp[len][status][pre] != -1)
return dp[len][status][pre];
int sum = 0;
for(int i = 0; i <= DIGIT; i++) {
if(vis[i]) continue;
if(is_zero) {
if(!i) {
if(len > THRESHOLD)
sum += dfs(len - 1, 0, 0, true);
}
else {
vis[i] = true;
sum += dfs(len - 1, i, 1<<i, false);
vis[i] = false;
}
}
else if(i) {
if(ban[pre][i] && vis[ban[pre][i]] == false) continue;
else {
vis[i] = true;
sum += dfs(len - 1, i, (1<<i) + status, false);
vis[i] = false;
}
}
}
if(!is_zero)
dp[len][status][pre] = sum;
return sum;
}
int main() {
memset(vis, false, sizeof(vis));
memset(dp, -1, sizeof(dp));
printf("%d\n", dfs(DIGIT, 0, 0, true));
return 0;
}