P1219 [USACO1.5]八皇后 Checker Challenge(DFS回溯)

深度优先搜索(dfs)后保留前 K 组有效数据的两种方法 深度优先搜索(dfs)后保留前 K 组有效数据的两种方法 洛谷例题:P1219 [USACO1.5]八皇后 Checker Challenge 1.一维数组存储数据,转入二维数组保存法 // int print() { if(total<=2)//保证只输出前三个解,如果解超出三个就不再输出,但后面的total还需要继续叠加 { for(int k=1;k<=n;k++) cout<<a[k]<<" ";//for语句输出 阅读详情

一个如下的 6 \times 66×6 的跳棋棋盘,有六个棋子被放置在棋盘上,使得每行、每列有且只有一个,每条对角线(包括两条主对角线的所有平行线)上至多有一个棋子。

上面的布局可以用序列 2\ 4\ 6\ 1\ 3\ 52 4 6 1 3 5 来描述,第 ii 个数字表示在第 ii 行的相应位置有一个棋子,如下:

行号 1\ 2\ 3\ 4\ 5\ 61 2 3 4 5 6

列号 2\ 4\ 6\ 1\ 3\ 52 4 6 1 3 5

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

输入格式

一行一个正整数 nn,表示棋盘是 n \times nn×n 大小的。

输出格式

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

输入输出样例

输入 #1

6

输出 #1复制

2 4 6 1 3 5
3 6 2 5 1 4
4 1 5 2 6 3
4

说明/提示

错解:

自己写了个DFS,最后一个测试点超时。。。

#include<bits/stdc++.h>
using namespace std;
int n;
int dx[]= {-1,1,0,0,1,1,-1,-1};
int dy[]= {0,0,-1,1,1,-1,1,-1};
int vis[20][20];
int f;
bool fun(int x,int y,int op)
{
    while(x>=1&&x<=n&&y>=1&&y<=n)
    {
        if(vis[x][y]==1)
            return false;
        x+=dx[op],y+=dy[op];
    }
    return true;
}
bool check(int x,int y)
{
    bool flag = true;
    for(int i = 0; i<8; i++)
    {
        int ax = x+dx[i];
        int ay = y+dy[i];
        flag = fun(ax,ay,i);
        if(flag == false)
            return false;
    }
    return true;
}
int step[20];
long long ans;
void dfs(int x,int num)
{
    if(num==n)
    {
        if(ans<3)
        {
            for(int i = 0;i<n;i++)
            {
                if(i==0)cout<<step[i];
                else cout<<" "<<step[i];
            }
            cout<<endl;
        }
        ans++;
        return ;
    }
    for(int i = 1; i<=n; i++)
    {
        if(check(x,i))
        {
            vis[x][i]=1;
            step[num]=i;
            dfs(x+1,num+1);
            vis[x][i]=0;
        }
    }
}
int main()
{
    cin>>n;
    dfs(1,0);
    cout<<ans<<endl;
}

正解:

 分析:要放一个棋子时没必要递归去判断三行三列以及两条对角线上是否有棋子,只需要利用初中知识。。。

开三个数组(其实应该是行一个,列一个,两条斜线两个,但是因为我们是一行一行去枚举的,所以已经保证了每行有一个,因此只需要开三个数组即可),分别为col[N],l[2*N],r[2*N]

斜线怎么表示呢?

只要在斜线上,b=X+Y,X和Y可以看作是棋子的横坐标和Y的纵坐标。

只要在这一条斜线上就一定满足,b = X-Y,此时b可能为负值,但是没关系,只需要加一个N即可保证b是正数。

#include<cstdio>
using namespace std;
int n,sum;
bool col[20],u[40],v[40];
int a[20];
void dfs(int x)
{
    if(x>n)
    {
        sum++;
        if(sum<=3)
        {
            for(int i=1;i<=n;i++)
            printf("%d ",a[i]);
            printf("\n"); 
        }
        return;
    }
    for(int i=1;i<=n;i++)
    { 
        if(!col[i]&&!u[x+i]&&!v[x-i+n])
        {
            col[i]=1;
            u[x+i]=1;
            v[x-i+n]=1;
            a[x]=i;
            dfs(x+1);
            col[i]=0;
            u[x+i]=0;
            v[x-i+n]=0;
        }
    } 
} 
int main()
{
    scanf("%d",&n);
    dfs(1);
    printf("%d",sum);
    return 0;
} 

 

P1219 [USACO1.5] 八皇后 Checker Challenge 八皇后问题是一个经典的回溯算法题,要求在n×n棋盘上放置n个互不攻击的皇后。解题要点是使用DFS逐行放置皇后,并通过标记列和对角线避免冲突。程序输出前三个解(按字典序)和解的总数。样例输入6时输出4种解,其中前三个为2 4 6 1 3 5、3 6 2 5 1 4和4 1 5 2 6 3。算法通过回溯和剪枝高效搜索,时间复杂度为O(n!),适用于n≤13的数据范围。 阅读详情

相关推荐

深度优先搜索及例题《基础》 洛谷

目录 P1706 全排列问题 P1219 [USACO1.5]八皇后 Checker Challenge P1605 迷宫 P1101 单词方阵 P1706 全排列问题 #include<stdio.h> #include<string.h> int a[15]; int b[15]; int n; void dfs(int); int main() { scanf("%d",&n); dfs(1); return 0..

m0_62331212的博客 2303

C语言经典八皇后问题——DFS,六皇后求解

题目描述 一个如下的 6 \times 66×6 的跳棋棋盘,有六个棋子被放置在棋盘上,使得每行、每列有且只有一个,每条对角线(包括两条主对角线的所有平行线)上至多有一个棋子。 上面的布局可以用序列 2 4 6 1 3 5 来描述,第 i 个数字表示在第 i 行的相应位置有一个棋子,如下: 行号 1 2 3 4 5 6 列号 2 4 6 1 3 5 这只是棋子放置的一个解。请编一个程序找出所有棋子放置的解。 并把它们以上面的序列方法输出,解按字典顺序排列。 请输出前 33个解。最后一行是解的总个数。 输入

s_meng_的博客 6013

题解:洛谷 P1219 [USACO1.5] 八皇后 Checker Challenge

等知名刷题平台精心挑选而来,并结合各平台提供的算法标签和难度等级进行了系统分类。题目涵盖了从基础到进阶的多种算法和数据结构,旨在为不同阶段的编程学习者提供一条清晰、平稳的学习提升路径。的跳棋棋盘,有六个棋子被放置在棋盘上,使得每行、每列有且只有一个,每条对角线(包括两条主对角线的所有平行线)上至多有一个棋子。这只是棋子放置的一个解。请编一个程序找出所有棋子放置的解。并把它们以上面的序列方法输出,解按字典顺序排列。前三行为前三个解,每个解的两个数字之间用一个空格隔开。第四行只有一个数字,表示解的总数。

团爸讲算法 847

2022-1-10学习总结

上午(3h) 上午刷了两道洛谷的搜索题,遇到的都是之前没有碰到过的题型。经过上午的学习,我发现做题要改变之前的思维,今天上午第一道题一上来我直接就采用了暴力枚举的方式,可是自己又考虑不到那么多种情况,因此浪费了许多时间。因此应该加强自己对搜索题的敏感度,不要看到一个题目就想用暴力。 PERKET 主要思路: 这道题一开始所采用的方法是暴力枚举,ac了一半,是由于这道题用枚举的话需要考虑的情况太多了。任意的组合都可以,只要是绝对差最小,并且有的可能只需要放一种配料,因此这里还是需要..

weixin_63638351的博客 438

基于C#的跨平台上位机开发:一次编写,多平台运行

摘要: 本文探讨了如何利用C#进行跨平台上位机开发,以适配Windows、Linux、macOS等多平台需求。通过分析传统单平台开发的局限性(如API差异、硬件接口兼容性),提出基于.NET 5/6/7的解决方案,重点推荐Avalonia(类WPF的跨平台UI框架)和GtkSharp(基于GTK+)实现图形界面。同时,针对硬件通信需求,介绍了System.IO.Ports串口通信和LibUsbDotNet的跨平台支持,并强调多平台调试(VS Code、Docker)的重要性,最终实现一次编码、多端部署的高效

这里只有干货:从 Modbus 通信到 MES 对接,从 YOLO 训练到工控机部署,带你搞定工业软件开发全流程。 1406

从MySQL到数据仓库:手把手教你用Airflow实现自动化ETL流水线

本文详细介绍了如何利用Airflow构建从MySQL到数据仓库的自动化ETL流水线,涵盖增量抽取策略、PySpark转换优化和数据质量监控等实战细节。特别适合中小规模企业构建高效数据仓库,提升数据处理效率和质量。

rnn9storyteller的博客 827

洛谷 P1219 八皇后

题目: 一个如下的 6×6的跳棋棋盘,有六个棋子被放置在棋盘上,使得每行、每列有且只有一个,每条对角线(包括两条主对角线的所有平行线)上至多有一个棋子。 上面的布局可以用序列2\ 4\ 6\ 1\ 3\ 5246135来描述,第ii个数字表示在第ii行的相应位置有一个棋子,如下: 行号1\ 2\ 3\ 4\ 5\ 6123456 列号2\ 4\ 6...

xiaolan7777777的博客 714

Obsidian笔记同步实战:基于Git的私有化部署与自动化管理

本文详细介绍了如何利用Git为Obsidian笔记构建私有化、自动化且免费的同步方案。通过安装配置Git与Obsidian-git插件,结合Gitee等远程仓库,实现笔记的版本管理、多设备同步与自动备份,打造安全可靠的知识管理体系。

y7z8a的博客 272

八皇后 Checker Challenge

题目描述 一个如下的 6×6 的跳棋棋盘,有六个棋子被放置在棋盘上,使得每行、每列有且只有一个,每条对角线(包括两条主对角线的所有平行线)上至多有一个棋子。 上面的布局可以用序列 2 4 6 1 3 5 来描述,第 ii 个数字表示在第 ii 行的相应位置有一个棋子,如下: 行号 1 2 3 4 5 6 列号 2 4 6 1 3 5 这只是棋子放置的一个解。请编一个程序找出所有棋子放置的解。 并把它们以上面的序列方法输出,解按字典顺序排列。 请输出前 3个解。最后一行是解的总个数。 输入格式 一行一个

qq_52273733的博客 495

Win10 + Linux 双系统删除(Linux)

删除Linux所使用的磁盘分区 进入此电脑->计算机->管理->磁盘管理

weixin_52247624的博客 943

目前最新NIST随机数测试软件下载、安装、及使用教程

最近由于科研需要,在搞一些随机数的测试的事情,众所周知 随机数测试我们可以使用NIST的软件进行多大15项的随机测试,我也在网上查找了很多大牛的博客,但是都是年代久远,很多的链接现在都是物是人非,都是不能直接使用了,今天顺便抽点时间更新一下这个NIST软件的下载及使用。我们首先讲一下该软件的下载:1.我们直接取NIST的官网(https://csrc.nist.gov/)下载即可 ;链接如下:下载...

Miracle.Zhao的博客 3万+

P1219 [USACO1.5]八皇后 Checker Challenge(dfs)

题目描述 一个如下的6 \times 66×6的跳棋棋盘,有六个棋子被放置在棋盘上,使得每行、每列有且只有一个,每条对角线(包括两条主对角线的所有平行线)上至多有一个棋子。 上面的布局可以用序列2\ 4\ 6\ 1\ 3\ 5246135来描述,第ii个数字表示在第ii行的相应位置有一个棋子,如下: 行号1\ 2\ 3\ 4\ 5\ 6123456 列号2\ 4\ 6\ 1\ 3\ 5246135 这只是棋子放置的一个解。请编一个程序找出所有棋...

weixin_46272577的博客 225

点云数据生成DEM,并导出三维模型

点云数据生成DEM,并导出三维模型

qq_42540466的博客 2万+

算法分类:DFS 搜索 P1219 [USACO1.5] 八皇后 Checker Challenge

算法分类:DFS 搜索。

andrewcrab的博客 796

基于FPGA的7x7矩阵求逆verilog开发

up目录一、理论基础二、核心程序三、测试结果 矩阵求逆,即求矩阵的逆矩阵。矩阵是线性代数的主要内容,很多实际问题用矩阵的思想去解既简单又快捷。逆矩阵又是矩阵理论的很重要的内容,逆矩阵的求法自然也就成为线性代数研究的主要内容之一。设A是数域上的一个n阶方阵,若在相同数域上存在另一个n阶矩B,使得: AB=BA=E。 则我们称B是A的逆矩阵,而A则被称为可逆矩阵。其中,E为单位矩阵。典型的矩阵求逆方法有:利用定义求逆矩阵、初等变换法、伴随阵法、恒等变形法等。 逆矩阵的求法有多种,其中重要

FPGA/MATLAB学习教程/源码/项目合作开发 3898

图像增强算法:基于Retinex的图像增强算法

该算法对图像的亮度和颜色进行分离处理,然后通过调整它们的比例来提高图像的质量。滤波后的图像将保留颜色信息,并减少图像中的噪声。接下来,Retinex算法使用一个高通滤波器对原始图像进行滤波处理,以增强图像中的亮度信息。通过使用Retinex增强算法,我们可以有效地提高图像的质量,增强图像中的细节和颜色信息。最后,Retinex算法通过将颜色恢复和亮度调整后的图像进行比例调整,以获得最终的增强图像。Retinex算法是一种常用的图像增强算法,它通过对图像的亮度和颜色进行调整,以提高图像的视觉质量。

XsiJava的博客 436

【洛谷 P1219】[USACO1.5]八皇后 Checker Challenge 题解(深度优先搜索+回溯法)

一个如下的6×6的跳棋棋盘,有六个棋子被放置在棋盘上,使得每行、每列有且只有一个,每条对角线(包括两条主对角线的所有平行线)上至多有一个棋子。上面的布局可以用序列246135来描述,第i个数字表示在第i行的相应位置有一个棋子,如下:行号123456列号246135这只是棋子放置的一个解。请编一个程序找出所有棋子放置的解。并把它们以上面的序列方法输出,解按字典顺序排列。请输出前3个解。最后一行是解的总个数。

HEX9CF的技术博客 577

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

洛谷P1219 [USACO1.5]八皇后 Checker Challenge DFS+回溯法求解(java)

题目描述 一个如下的 6×6跳棋棋盘,有六个棋子被放置在棋盘上,使得每行、每列有且只有一个,每条对角线(包括两条主对角线的所有平行线)上至多有一个棋子。 上面的布局可以用序列 2 4 6 1 3 5 来描述,第 i 个数字表示在第 i 行的相应位置有一个棋子,如下: 行号 1 2 3 4 5 6 列号 2 4 6 1 3 5 这只是棋子放置的一个解。请编一个程序找出所有棋子放置的解。并把它们以上面的序列方法输出,解按字典顺序排列。请输出前 3个解。最后一行是解的总个数。 输入格式 一行一个正整数 n,表示

零陵上将军_xdr的博客 383

NTscan扫描工具

ntscan是一个扫描器,可以扫描没有密码和弱密码的共享,先到配置文件中填写猜测的用户名和密码,扫描过程中右侧出现的是扫描日志。

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

P1219 [USACO1.5]八皇后 Checker Challenge(dfs+回溯)

#include <iostream> #include <cstdio> #include <string> #include <algorithm> #include <vector> #include <queue> #include <stack> #include <cstring> #include <set> #include <cmath> #include <ma.

Ghostttttttiii的博客 77

android 蓝牙通讯demo

android 下蓝牙通讯demo,实现了发现蓝牙,使能蓝牙,通过蓝牙发送消息。

P1219 [USACO1.5] 八皇后 Checker Challenge(详解、c++)

的跳棋棋盘,有六个棋子被放置在棋盘上,使得每行、每列有且只有一个,每条对角线(包括两条主对角线的所有平行线)上至多有一个棋子。前三行为前三个解,每个解的两个数字之间用一个空格隔开。第四行只有一个数字,表示解的总数。这只是棋子放置的一个解。请编一个程序找出所有棋子放置的解。并把它们以上面的序列方法输出,解按字典顺序排列。最后一行是解的总个数。上面的布局可以用序列。

2301_77012063的博客 1206

初学dfs深度优先搜索&洛谷【 八皇后 Checker Challenge】题解

深度优先搜索&八皇后问题

2303_80645080的博客 2055

P1219 [USACO1.5]八皇后 Checker Challenge(C语言)

P1219 [USACO1.5]八皇后 Checker Challenge 1.思路 1.1对角线的表示 首先根据题目的要求,我们可以用一个数组line[13]表示皇后放置的位置 如line[4]=5 则表示第4行第5列放了一个皇后。然后再分别用ud[13],ld[13]表示上,下对角线 看上对角线的图,不难发现处于上对角线的值都是相等的则可以用ud[i+j]来表示,其中i表示第几行,j表示第几列。 可能还有一点很难理解,为什么ud[i-j]能表示一条对角线,不就是一个单独的坐标吗? 其实很容易想明白了

浮生未歇 3094

P1219 八皇后 Checker Challenge

本文介绍了使用深度优先搜索(DFS)解决八皇后问题的算法。题目要求在n×n棋盘上放置n个皇后,满足每行、每列和每条对角线上最多一个皇后。作者通过DFS逐行放置皇后,使用数组标记已占用的列,并通过双重循环检查对角线冲突。当找到解时记录结果,最后输出前三个解和总解数。该算法通过回溯法有效解决了皇后位置冲突问题,时间复杂度为O(n!),适用于n≤13的规模。代码实现清晰,包含输入处理、DFS搜索和结果输出三个主要部分。

2301_80684112的博客 501
上一篇: 洛谷P5764 新年好(dijkstra堆优化+DFS)
下一篇: 洛谷 P1182 数列分段 Section II
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值