当前位置: 首页 > news >正文

《算法笔记》8.1小节——搜索专题->深度优先搜索(DFS)问题 D: 【递归入门】n皇后 问题(原始的8皇后问题)

题目描述

       会下国际象棋的人都很清楚:皇后可以在横、竖、斜线上不限步数地吃掉其他棋子。如何将8个皇后放在棋盘上(有8 * 8个方格),使它们谁也不能被吃掉!这就是著名的八皇后问题。

输入

一个整数n( 1 < = n < = 10 ) 

输出

每行输出对应一种方案,按字典序输出所有方案。每种方案顺序输出皇后所在的列号,相邻两数之间用空格隔开。如果一组可行方案都没有,输出“no solute!”

样例输入
4
样例输出
2 4 1 3
3 1 4 2

分析:可以用生成全排列的方法表示皇后的坐标,其中第一个坐标用存储数组的位置下标代替,生成的全排列就是皇后的第二个坐标。显然第一个坐标和第二个坐标都不会重复,即皇后不会处于同一排或者同一列上,因此只需要判断是否处在同一斜线上。这样在生成全排列的时候就可以提前去掉不可能的组合,能够生成的排列一定是符合要求的。

如果两个皇后处于同一斜线上,这条斜线的斜率绝对值一定为1,即两个皇后的横坐标之差等于纵坐标之差。前面提到横坐标是存储数组的下标,纵坐标是生成的排列,这样相减后取绝对值进行比较即可。

#include<algorithm>
#include <iostream>
#include  <cstdlib>
#include  <cstring>
#include   <string>
#include   <vector>
#include   <cstdio>
#include    <queue>
#include    <stack>
#include    <ctime>
#include    <cmath>
#include      <map>
#include      <set>
#define ll long long
#define INF 0x3f3f3f3f
#define db1(x) cout<<#x<<"="<<(x)<<endl
#define db2(x,y) cout<<#x<<"="<<(x)<<", "<<#y<<"="<<(y)<<endl
#define db3(x,y,z) cout<<#x<<"="<<(x)<<", "<<#y<<"="<<(y)<<", "<<#z<<"="<<(z)<<endl
#define db4(x,y,z,a) cout<<#x<<"="<<(x)<<", "<<#y<<"="<<(y)<<", "<<#z<<"="<<(z)<<", "<<#a<<"="<<(a)<<endl
using namespace std;

void getans(int n,int index,int *num,int *flag,int &ans)
{
    if(index==n)
    {
        ans++;
        for(int i=0;i<n;++i)
            i==0?printf("%d",num[i]):printf(" %d",num[i]);
        printf("\n");
        return;
    }
    for(int i=1;i<=n;++i)
    {
        if(flag[i]==0)
        {
            int f=1;
            for(int j=0;j<index;++j)
            {
                if((int)fabs(num[j]-i)==(int)fabs(index-j))
                {
                    f=0;break;
                }
            }
            if(f)
            {
                num[index]=i,flag[i]=1;
                getans(n,index+1,num,flag,ans);
                flag[i]=0;
            }
        }
    }
    return;
}

int main(void)
{
    #ifdef test
    freopen("in.txt","r",stdin);
    //freopen("out.txt","w",stdout);
    clock_t start=clock();
    #endif //test

    int n;
    while(~scanf("%d",&n))
    {
        if(n<=3)
        {
            printf("no solute!\n");
            continue;
        }
        int num[n+5]={0},flag[n+5]={0};
        int ans=0;
        getans(n,0,num,flag,ans);
    }

    #ifdef test
    clockid_t end=clock();
    double endtime=(double)(end-start)/CLOCKS_PER_SEC;
    printf("\n\n\n\n\n");
    cout<<"Total time:"<<endtime<<"s"<<endl;        //s为单位
    cout<<"Total time:"<<endtime*1000<<"ms"<<endl;    //ms为单位
    #endif //test
    return 0;
}


文章转载自:

http://z7xnGMPF.xwnnp.cn
http://VOvdwusO.xwnnp.cn
http://mn6XqyXP.xwnnp.cn
http://BRK5xpLU.xwnnp.cn
http://cTqQlwf7.xwnnp.cn
http://56ivUZvL.xwnnp.cn
http://Oeo1yXoc.xwnnp.cn
http://AILYfH60.xwnnp.cn
http://bP4xZfBG.xwnnp.cn
http://O9ydt46L.xwnnp.cn
http://MODy4LVg.xwnnp.cn
http://v80PwRKw.xwnnp.cn
http://b24vhyN5.xwnnp.cn
http://SrvpGtSj.xwnnp.cn
http://UG3LgVgs.xwnnp.cn
http://XygAyFrn.xwnnp.cn
http://nX5tbqfO.xwnnp.cn
http://THfAXvCp.xwnnp.cn
http://EZB1DSX8.xwnnp.cn
http://WIqjlrq1.xwnnp.cn
http://UeoczlfA.xwnnp.cn
http://rWmPAVpX.xwnnp.cn
http://fYjj3kr9.xwnnp.cn
http://fDKPvT3q.xwnnp.cn
http://rMjXobVM.xwnnp.cn
http://UxMqYTGC.xwnnp.cn
http://AZWfq9gX.xwnnp.cn
http://g0zPrJKv.xwnnp.cn
http://l2G0d2K1.xwnnp.cn
http://MNlNxNao.xwnnp.cn
http://www.dtcms.com/a/66024.html

相关文章:

  • 我又又又又又又更新了~~纯手工编写C++画图,有注释~~~
  • 【C#】使用DeepSeek帮助评估数据库性能问题,C# 使用定时任务,每隔一分钟移除一次表,再重新创建表,和往新创建的表追加5万多条记录
  • USER与多组织关联的SQL查询以及几个关键函数用法
  • ​面向对象与面向过程编程:从概念到实战的深度解析
  • ROS学习过程(一)
  • unity几种设计模式(自用)
  • 【复习】补充
  • Cookie与Session详解
  • C++ string
  • ES6(1) 简介与基础概念
  • 计算机二级——Python:Day1
  • 力扣215.数组中的第K个最大元素--堆排序法(java)
  • 透过安全事件看软件组成分析SCA
  • 26岁赵露思病好后大变样,穿披肩染奶奶灰意外惊艳,复工后美回巅峰
  • 专题|Python贝叶斯金融数据应用实例合集:随机波动率SV模型、逻辑回归、参数更新、绩效比较BEST分析亚马逊股票、普尔指数...
  • Linux 守护进程与 SSH 安全配置指南
  • 【草原之歌】:守护绿色的律动与《草原法》的力量
  • Practical Coding Function Design for Time-of-Flight Imaging文章解读,CVPR2019
  • 智能合约:Solidity(基于以太坊或兼容链,如 Polygon、BSC)(仅供学习区块链知识,不可进行违法开发应用)
  • 基于DeepSeek×MWORKS 2025a的ROM Builder自动化降阶实战
  • php将身份证号写入excel文件出现科学计数法问题解决
  • 详解CPU的组成与功能
  • leetcode hot100贪心
  • 使用自动导入后,eslint报错 eslint9
  • CCF CSP 第30次(2023.09)(1_坐标变换_C++)(先输入再计算;边输入边计算)
  • Xshell连接autodl时提示ssh服务器拒绝了密码,请再试一次
  • 【大模型学习】第十九章 什么是迁移学习
  • 微店关键词搜索商品详情API接口解析与应用
  • C++双端队列知识点+习题
  • ollama下载的DeepSeek的模型(Model)文件在哪里?(C盘下)