设定三个方向,寻求方向之间的联系,dfs递归求解
复习dfs的时候回来看看
#include<iostream>
#include<cstring>
#include<cstdio>
#include<algorithm>
#include<vector>
#include<set>
#include<map>
#include<queue>
#include<cmath>
#define ll long long
#define mod 1000000007
#define inf 0x3f3f3f3f
using namespace std;
bool vis[105][3];
int cnt;
int n;
int ans = 0;
int ans1[15];
void calc(int cnt)
{
if(cnt == n + 1)
{
ans ++;
return ;
}
for(int i = 1; i <= n; i ++)
{
if((! vis[cnt-i+n][0]) && (! vis[i][1]) && (! vis[cnt+i][2]))
{
vis[cnt-i+n][0] = vis[i][1] = vis[cnt+i][2] = 1;
calc(cnt + 1);
vis[cnt-i+n][0] = vis[i][1] = vis[cnt+i][2] = 0;
}
}
}
void init()
{
for(n = 1; n <= 10; n ++)
{
memset(vis, 0, sizeof(vis));
ans = cnt = 0;
calc(1);
ans1[n] = ans;
}
}
int main()
{
init();
while(scanf("%d",&n) != EOF && n)
{
printf("%d\n", ans1[n]);
}
return 0;
}