/* ID:chenjiong PROG:checker LANG:C++ */ #include <stdio.h> #include <string.h> const int MAXN = 15; int N; bool column[MAXN]; bool diagonal1[2 * MAXN - 1]; bool diagonal2[2 * MAXN - 1]; int ans[MAXN]; int p; int cnt; int print_times; void dfs(int cur) { if ( cur == N + 1 ) { if ( print_times < 3 ) { for (int i = 0; i < N - 1; i++) printf("%d ",ans[i]); printf("%d\n",ans[N - 1]); print_times++; cnt++; return; } else { cnt++; return; } } int j; for ( j = 1; j <= N; j++) { if ( !column[j] && !diagonal1[cur + j] && !diagonal2[cur - j + N] ) { column[j] = diagonal1[cur + j] = diagonal2[cur - j + N] = true; ans[p] = j; p++; dfs(cur + 1); p--; column[j] = diagonal1[cur + j] = diagonal2[cur - j + N] = false; } } } int main() { freopen("checker.in","r",stdin); freopen("checker.out","w",stdout); scanf("%d",&N); cnt = 0; print_times = 0; dfs(1); printf("%d\n",cnt); return 0; }