/*
    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;
}

 

posted on 2012-10-27 00:51  Sinker  阅读(177)  评论(0编辑  收藏  举报