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

你可能感兴趣的:(HDU)