zoukankan      html  css  js  c++  java
  • HDU

    在N*N的方格棋盘放置了N个皇后,使得它们不相互攻击(即任意2个皇后不允许处在同一排,同一列,也不允许处在与棋盘边框成45角的斜线上。
    你的任务是,对于给定的N,求出有多少种合法的放置方法。

    Input共有若干行,每行一个正整数N≤10,表示棋盘和皇后的数量;如果N=0,表示结束。Output共有若干行,每行一个正整数,表示对应输入行的皇后的不同放置数量。Sample Input

    1
    8
    5
    0

    Sample Output

    1
    92
    10
    #include <cstdio>
    #include <iostream>
    #include <cmath>
    #include <algorithm>
    #include <cstring>
    
    using namespace std;
    
    #define ll long long
    
    int n, position[18], line[18], sum, r;
    
    bool compare(int miao)
    {
        for(int i = 1; i<miao; i++)//一行一行来判断,如果写线上有相同的或者同一列上有相同的,那就是错的
            if((abs(miao - i) == abs(line[miao]-line[i])) || line[miao] == line[i])
                return 0;
        return 1;
    }
    
    int queen(int t)
    {
        if(t>r) sum++;
        else
            for(int i = 1; i <= r; i++)//一列一列的查找
            {
                line[t] = i;//第t行的第i列
                if(compare(t))queen(t+1);//如果在t阶矩阵下能进行排列,那就开始尝试t+1阶矩阵
            }
        return sum;
    }
    
    int main()
    {
        memset(line, 0, sizeof(line));
        for(r= 1; r<11; r++)//在输入之前,先把所有的数存起来,解决时间。r为r阶矩阵下的n皇后
        {
            sum = 0;//每次都使sum = 0是为了在每次查r阶矩阵的时候,结果不会重复
            position[r] = queen(1);//一行一行的查找,先从第一行开始查找
        }
        while(~scanf("%d", &n) && n)
        {
            printf("%d
    ", position[n]);
        }
        return 0;
    }
  • 相关阅读:
    IOS无线客户端自动化测试
    junit 测试报错 java.lang.Exception: No runnable methods
    mysql varchar(128)可以存多少汉字
    求两个数的百分比
    日期转换
    两个 integer 值判断是否相等
    整洁代码之道——重构
    Eclipse里项目名有红叉,但是底下的每一个文件都没有红叉
    #dubbo# XML文件报错dubbo:XX解决方法
    String处理入门
  • 原文地址:https://www.cnblogs.com/RootVount/p/10479819.html
Copyright © 2011-2022 走看看