zoukankan      html  css  js  c++  java
  • 洛谷P1219 :八皇后(DFS+回溯)

    题目描述

    检查一个如下的6 x 6的跳棋棋盘,有六个棋子被放置在棋盘上,使得每行、每列有且只有一个,每条对角线(包括两条主对角线的所有平行线)上至多有一个棋子。
    在这里插入图片描述
    上面的布局可以用序列2 4 6 1 3 5来描述,第i个数字表示在第i行的相应位置有一个棋子,如下:

    行号 1 2 3 4 5 6

    列号 2 4 6 1 3 5

    这只是跳棋放置的一个解。请编一个程序找出所有跳棋放置的解。并把它们以上面的序列方法输出。解按字典顺序排列。请输出前3个解。最后一行是解的总个数。

    //以下的话来自usaco官方,不代表洛谷观点

    特别注意: 对于更大的N(棋盘大小N x N)你的程序应当改进得更有效。不要事先计算出所有解然后只输出(或是找到一个关于它的公式),这是作弊。如果你坚持作弊,那么你登陆USACO Training的帐号删除并且不能参加USACO的任何竞赛。我警告过你了!

    输入输出格式

    输入格式:
    一个数字N (6 <= N <= 13) 表示棋盘是N x N大小的。

    输出格式:
    前三行为前三个解,每个解的两个数字之间用一个空格隔开。第四行只有一个数字,表示解的总数。

    输入输出样例

    输入样例#1:
    6
    输出样例#1:
    2 4 6 1 3 5
    3 6 2 5 1 4
    4 1 5 2 6 3
    4

    说明
    题目翻译来自NOCOW。

    USACO Training Section 1.5

    AC代码

    #include <bits/stdc++.h>
    #define  ms(a,b) memset(a,b,sizeof(a))
    using namespace std;
    int n;
    int a[100],b[100],c[100],d[100];
    //b->列,c->左下到右上,d->右下到左上
    int way[100];
    int ans;
    // 输出,一共要求输出三个,所以ans=2时停止
    void print()
    {
        if(ans<3)
        {
            for(int i=1;i<=n;i++)
                cout<<a[i]<<" ";
            cout<<endl;
        }
        ans++;
    }
    void dfs(int i)
    {
        if(i>n)
        {
            print();
            return ;
        }
        else
        {
            for(int j=1;j<=n;j++)
            {
                if(b[j]+c[i+j]+d[i-j+n]==0)
                {
                    a[i]=j;
                    b[j]=1;
                    // 从左上->右下的对角线上行数-列数是定值
                    // 从左下->右上的对角线上行数+列数是定值
                    c[i+j]=1;
                    d[i-j+n]=1;
                    dfs(i+1);
                    // 回溯
                    b[j]=0;
                    c[i+j]=0;
                    d[i-j+n]=0;
                }
            }
        }
    }
    int main()
    {
        ios::sync_with_stdio(false);
        cin>>n;
        ms(a,0);ms(b,0);ms(c,0);ms(d,0);
        dfs(1);
        cout<<ans<<endl;
        return 0;
    }
    
  • 相关阅读:
    rs
    stm32f767 usoc3
    stm32f767 RTT 日志
    stm32f767 标准库 工程模板
    stm32f767 HAL 工程模板
    docker tab 补全 linux tab 补全
    docker anconda 依赖 下载 不了
    docker run 常用 指令
    linux scp 命令
    Dockerfile 常用参数说明
  • 原文地址:https://www.cnblogs.com/Friends-A/p/10324327.html
Copyright © 2011-2022 走看看