试题 算法训练 N皇后问题(明确清晰)

news/2024/7/20 21:18:22 标签: 算法, 深度优先

试题 算法训练 N皇后问题

提交此题 评测记录
资源限制
内存限制:256.0MB C/C++时间限制:100ms Java时间限制:300ms Python时间限制:500ms
问题描述
  在N*N的方格棋盘放置了N个皇后,使得它们不相互攻击(即任意2个皇后不允许处在同一排,同一列,也不允许处在与棋盘边框成45角的斜线上。你的任务是,对于给定的N,求出有多少种合法的放置方法。
输入格式
  输入中有一个正整数N≤10,表示棋盘和皇后的数量
输出格式
  为一个正整数,表示对应输入行的皇后的不同放置数量。
画了个图便于理解
在这里插入图片描述

题目分析

图片中放置了一个皇后,可以看到右对角线他们的和相加是相等的,而左对角线他们是相减相等的。用一维数组来解决这个问题,假设存在一个皇后表示 a[i]=j;他所代表的意思是在第i行的j列放置了一个皇后。进行递归是一行一行的往下递归,约定一行只能放置一个皇后。

测试代码

#include<iostream>
#include <stdlib.h>
using namespace std;
const int N = 15;
int res = 0, n;
int a[N];
bool check(int x, int y) {
    //因为规定了a[i]=j;i表示行,j表示列,并且是一行一行往下递归
    //所以只需要看前面的行数与现在的放置冲突不
    for (int i = 1; i < x; i++) {
        //如果为同一列则不行
        if (a[i] == y)return false;
        //如果为右斜线则不行
        if (a[i] + i == x + y)return false;
        //如果为左斜线则不行
        if (i - a[i] == x - y)return false;
    }
    return true;
}
void dfs(int row) {
    //如果层数大于给定的n层数说明产生一个解
    if (row == n + 1) {
        res++;
        return;
    }
    for (int i = 1; i <= n; i++) {
        //检查是否可以放置皇后
        if (check(row, i)) {
            //可以则把第几列的值,赋给当前行
            a[row] = i;
            //去下一行寻找放置的位置
            dfs(row + 1);
            //不成功回溯回来,还原当前行的值
            a[row] = 0;
        }
    }
}
int main() {
    cin >> n;
    //从第一行开始寻找
    dfs(1);
    cout << res << endl;
    return 0;
}

运行结果

在这里插入图片描述

在这里插入图片描述
在这里插入图片描述


http://www.niftyadmin.cn/n/55614.html

相关文章

2023年批量下载和改名音频专辑(系列3之selenium-wire方式)

XIMA多页动态列表中的音频下载seleniumwire步骤说明&#xff1a;步骤一&#xff1a;获取xima cookie步骤二&#xff1a;遍历目录&#xff0c;逐一播放后抓取响应信息除了系列1之单页&#xff0c;系列2之多页&#xff0c;VIP音频还有动态加载音频列表&#xff0c;动态按钮通过脚…

Java笔记-集合框架

目录1、Java集合框架体系图2、Collection(1)List-有序、可重复获取线程安全的List(2)Set-无序、元素不可重复(3)Queue-队列集合3.Map&#xff08;1&#xff09;HashMapHashMap为啥线程不安全&#xff08;2&#xff09;LinkedHashMap&#xff08;3&#xff09;TreeMap&#xff0…

Linux:全志H3图像codec使用笔记

1. 前言 限于作者能力水平&#xff0c;本文可能存在谬误&#xff0c;因此而给读者带来的损失&#xff0c;作者不做任何承诺。 2. 图像 codec 概述 图像编解码器(codec) 包含 Encoder 和 Decoder 两部分功能。我们用下列分别说明 Encoder 和 Decoder 的工作方式。 ----------…

评论上的情感分析:主题与情感词抽取 附完整代码(基于 tensorflow word2vec lstm 等算法进行主题与情感词抽取)

项目描述 基于 tensorflow word2vec lstm 等算法进行主题与情感词抽取: 针对评论网站上的用户评论进行细粒度的情感分析,区别于传统的粗粒度的情感分类(判断一句话的表达情感的正/负性),评论者在一句话中往往会提到多个角度,并在每个角度都抱有不同的观点内容与正/负极性…

【C/C++基础练习题】简单语法使用练习题

&#x1f349;内容专栏&#xff1a;【C/C要打好基础啊】 &#x1f349;本文内容&#xff1a;简单语法使用练习题&#xff08;复习之前写过的实验报告&#xff09; &#x1f349;本文作者&#xff1a;Melon西西 &#x1f349;发布时间 &#xff1a;2023.2.10 目录 1、输入三个数…

【VictoriaMetrics】VictoriaMetrics单机版部署(二进制版)

1、下载安装包git路径,本文基于1.87.1版本 进入git地址 :https://github.com/VictoriaMetrics/VictoriaMetrics/tags 2、下载其中linux下的 amd64架构

【C++】从0到1入门C++编程学习笔记 - 提高编程篇:STL常用算法(集合算法)

文章目录一、set_intersection二、set_union三、set_difference学习目标&#xff1a; 掌握常用的集合算法 算法简介&#xff1a; set_intersection // 求两个容器的交集 set_union // 求两个容器的并集 set_difference // 求两个容器的差集 一、set_intersection 功能描…

为什么神经网络做不了2次函数拟合,网上的都是骗人的吗?

环境&#xff1a;tensorflow2 kaggle 这几天突发奇想&#xff0c;用深度学习训练2次函数。先在网上找找相同的资料这方面资料太少了。大多数如下&#xff1a; 。 给我的感觉就是&#xff0c;用深度学习来做&#xff0c;真的很容易。 网上写出代码分析的比较少。但是也找到了…