• 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
    */
  • 相关阅读:
    【蓝桥杯】基础练习 十六进制转十进制
    【蓝桥杯】 基础练习 十六进制转八进制
    【蓝桥杯】 入门训练 序列求和
    【蓝桥杯】 入门训练 圆的面积
    【蓝桥杯】入门训练 Fibonacci数列
    6次考试小结
    搜索
    sudoku
    生日蛋糕
    木棒
  • 原文地址:https://www.cnblogs.com/zxj015/p/2740257.html
Copyright © 2020-2023  润新知