zoukankan      html  css  js  c++  java
  • 「JoyOI1080」N皇后

    这是菜鸡的我第一次写这类题目:

    题意:就是在N*N的棋盘上,每一行,每一列,所有的对角线都只能有一个棋子。

    先分析:假若N=4;

        则为其中的一种答案。要输出左右的解,肯定要枚举出所有的解。那么非常自然的想到递归!

      根据题意,每一步棋子都满足,在一行,一列,两个对角线。那么怎么解决呢?

      总体递归思路,肯定是以一行为处理单位的啦。每一行总从左到右是判断是否这个棋子可以判断。

    不相邻行的两个棋子:

    在这里,我们先解决不为相邻行时,两个棋子不同列不同对角线问题。

    不同列:直接定义一个数组,比如b[ 1 ]=1就表示第1列已经摆了一个棋子了。那么后面的棋子直接判断就行了。

    不同列:

          很明显在出现这种情况之前一定会出现这种摆法:所以根本不用担心这种情况的发生。

    相邻行的两个棋子:

    我们解决怎样判断同一列,在两个对角线中。

    不同列:直接定义一个数组,比如b[ 1 ]=1就表示第1列已经摆了一个棋子了。那么后面的棋子直接判断就行了。

    对角线一:  假设第一个点坐标为(x, y)那么,相邻行并且同对角线的下一个点的坐标是就是(x+1, y-1),对吧。是不是找到规律了。

         x+y=(x+1)+(y-1)  这样就定义一个数组c[],  那么 c[x+y]=1就可以表示点(x, y)所在的这类这条对角线已经有一个棋子。

    对角线二:这类对角线的上的点的坐标变化都是横纵坐标各自加1.这其实很好办,每个坐标都满足x-y+n=k,每一条对角线对应唯一的一          

               个k值.至于x,y谁在前谁在后都无所谓,关键是抵消加1这个操作。那么定义d[ x-y+n ]=1表示这个对角线已经有了一个棋子。

    #include<iostream>
    using namespace std;
    int n, sum, a[15];
    bool b[100], c[100], d[100];
    void print(){
        sum++;
        if (sum <= 3){
            for (int i = 1; i <= n; ++i)
            {
                cout << a[i] << " 
    "[(i != n ? 0 : 1)];
            }
        }
    }
    void queen(int i)
    {
        for (int j = 1; j <= n; ++j)
        {
            if ((b[j] == 0) && (c[i + j] == 0) && (d[i - j+n] == 0))
            {
                a[i] = j;
                b[j] = 1;
                c[i + j] = 1;
                d[i - j + n] = 1;
                if (i == n)print();
                else queen(i + 1);
                b[j] = 0;
                c[i + j] = 0;
                d[i - j + n] = 0;
            }
        }
    }
    int main()
    {
        cin >> n;
        queen(1);
        cout << sum << endl;
        return 0;
    }
  • 相关阅读:
    数据结构考研--线性表例2-4
    2011 BENELLI TRE1130K所有系统诊断:OBDSTAR MS80或OBDSTAR MS50?
    BMW E60可以通过Autel IM508和XP400 Pro读取数据并学习密钥吗?
    Launch X431 V V4.0 2021最新升级:32GB存储+ 30特殊功能
    Autel IM608 Pro为BMW 2010 535i添加新钥匙
    Xhorse VVDI Prog V5.0.0软件免费下载
    使用XP400 Pro通过Autel IM508读取Benz W207 EIS数据
    由CGDI Prog BMW与GODIAG GT100进行的BMW FEM / BDC密钥编程
    BMW CAS4 / CAS4 +编程测试平台购买建议
    2021 GODIAG GT100 ECU接线盒评测:出色的诊断和节省维修成本的设备
  • 原文地址:https://www.cnblogs.com/ALINGMAOMAO/p/10008052.html
Copyright © 2011-2022 走看看