• hdu2553.c


    N皇后问题,经典

    /*
     * =====================================================================================
     *
     *       Filename:  2553.c
     *        Version:  1.0
     *        Created:  2013年11月23日 15时42分08秒
     *       Revision:  none
     *       Compiler:  gcc
     *         Author:  Wenxian Ni (Hello World~), niwenxianq@qq.com
     *   Organization:  AMS/ICT
     *    Description:  
    N皇后问题
    
    Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)
    Total Submission(s): 6405    Accepted Submission(s): 2913
    
    
    Problem Description
    在N*N的方格棋盘放置了N个皇后,使得它们不相互攻击(即任意2个皇后不允许处在同一排,同一列,也不允许处在与棋盘边框成45角的斜线上。
    你的任务是,对于给定的N,求出有多少种合法的放置方法。
    
     
    
    Input
    共有若干行,每行一个正整数N≤10,表示棋盘和皇后的数量;如果N=0,表示结束。
     
    
    Output
    共有若干行,每行一个正整数,表示对应输入行的皇后的不同放置数量。
     
    
    Sample Input
    1
    8
    5
    0
     
    
    Sample Output
    1
    92
    10
     *
     * =====================================================================================
     */
    
    #include <iostream>
    #include <cstdio>
    #include <cstdlib>
    #include <cmath>
    #include <cstring>
    #include <string>
    #include <algorithm>
    #include <vector>
    #include <set>
    #include <map>
    #include <queue>
    #include <stack>
    using namespace std;
    
    /*
    freopen("input.txt","r",stdin);
    freopen("output.txt","w",stdout);
    */
    
    int visit[11];//标记每一列
    int maps[11];//maps[i]表示第i行第maps[i]列放置一个皇后
    int xh[11];
    int ans;//记录有多少种放发
    
    void dfs(int k,int n)//第k行
    {
        int i,j,flag;
        if(k==n+1)//已经放完了n行
        {
            ans++;
            return ;
        }
        for(i=1;i<=n;i++)//第i列
        {
            if(visit[i]==0)
            {
                maps[k]=i;
                flag=0;
                for(j=1;j<k;j++)//判断第k个位置是否和前k-1个位置在对角线上面
                    if((maps[k]-maps[j])==(k-j)||(maps[j]-maps[k])==(k-j))
                    {
                        flag=1;
                        break;
                    }
                if(flag==0)//如果没有和前k-1个在对角线上
                {
                    visit[i]=1;
                    dfs(k+1,n);
                    visit[i]=0;//这个地方记住要修改过来
                }
            }
        }
    }
    
    int main()
    {
        int i,j,n;
        for(i=1;i<=10;i++)
        {
            memset(visit,0,sizeof(visit));
            memset(maps,0,sizeof(maps));
            ans=0;
            dfs(1,i);//一行一行的放,从第一行放到第i行
            xh[i]=ans;
        }
        while(cin>>n&&n)
        {
            cout<<xh[n]<<endl;
        }
        return 520;
    }
    


    每天早上叫醒你的不是闹钟,而是心中的梦~
  • 相关阅读:
    JS事件冒泡、事件捕获和事件委托
    实现英文字母排序
    JavaScript异步加载的四种方法
    JavaScript作用域与作用域链
    JavaScript 自定义属性 data-*
    asycn和await
    style collectd
    JavaScript如何比较两个数组的内容是否相同
    VScode插件开发--M2D文档转换插件
    BOM笔记
  • 原文地址:https://www.cnblogs.com/vintion/p/4117009.html
Copyright © 2020-2023  润新知