hdu 2553 N皇后问题

//1.非递归:

#include <cstdio>
#include <cmath>

 

using namespace std;

 

#define N 13

 

int x[N];

 

bool isvalid(int k)
{
    int i;
    for(i=0; i<k; i++)
        if(x[i]==x[k] || abs(x[i]-x[k])==abs(i-k))
            return false;
    return true;
}

int queen(int n)
{
    int k=0,count=0;
    x[k]=-1;
    while(k>=0)
    {
        x[k]++;
        while(x[k]<=n-1 && !isvalid(k))x[k]++;
        if(x[k]>n-1)k--;
        else if(k==n-1)++count;
        else x[++k]=-1;
    }
    return count;
}

int main()
{
    int n,ans[N]= {0};
    for(n=1; n<=11; n++)
        ans[n]=queen(n);
    while(scanf("%d",&n)!=EOF && n)
        printf("%d\n",ans[n]);
    return 0;
}

  

//**********************************************// 

 

//2.递归:

#include <cmath>
#include <iostream>

using namespace std;

#define N 12

int n,sum,x[N]= {0}; //x[i]代表第i个皇后的列序号,行序号是下标i

bool isvalid(int i)
{
    for(int j=0; j<i; j++)
    {
        //同一列  || 同一斜线上
        if( x[j]==x[i] || abs( x[j] - x[i] ) == i- j)
            return false;
    }
    return true;
}

void print()
{
    bool board[N][N]= {0};
    for(int i=0; i<n; i++)
        board[i][ x[i] ]=true;
    for(int i=0; i<n; i++)
    {
        for(int j=0; j<n; j++)
            printf("%d ",board[i][j]);
        printf("\n");
    }
    printf("\n");
}

void dfs(int cur)
{
    if(cur==n)
    {
        sum++;
// print();
    }
    else
        for(int i=0; i<n; i++) //探索第i层(第cur个皇后)的所有列号
        {
            x[cur]=i;
            if( isvalid(cur) )
            {
                dfs( cur+1 );
                //x[cur]=0;
            }
        }
}

int main()
{
    while(scanf("%d",&n) !=EOF )
    {
        sum=0;
        dfs(0);
        printf("sum=%d\n",sum);
    }
    return 0;
}

 

/*
1=1
2=0
3=0
4=2
5=10
6=4
7=40
8=92
9=352
10=724
*/

 

posted @ 2010-08-18 13:26  菜到不得鸟  阅读(472)  评论(0)    收藏  举报