当前位置: 首页 > 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;
}

相关文章:

  • 我又又又又又又更新了~~纯手工编写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自动化降阶实战
  • wap免费网站/兰州百度推广的公司
  • 网站建设高端设计/重庆百度关键词优化软件
  • 企业网站导航代码/制作一个网站需要多少费用
  • wordpress论坛系统/微信搜索seo优化
  • 电子商务网站建设与管理答案b/流量精灵官网
  • 做商城网站需要办理什么/如何制作网站链接