HDU2553 N皇后问题

2024-08-26 08:32
文章标签 问题 皇后 hdu2553

本文主要是介绍HDU2553 N皇后问题,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

大致题意:在N*N的棋盘上摆放N个皇后,注意是正好N个皇后二不是小于N,使横竖左右均没有对应的皇后,完成一次求解。统计这样的次数。
大致思路:如果做过Fire Net (http://acm.hdu.edu.cn/showproblem.php?pid=1045)的话会很自然想到建立一个10 * 10 的二维数组来保存这样的棋盘,每次放置一个棋子并且判断是否可以放置,如果可以放置则进行下一次的搜索。大致代码会如下:

DFS(int pos)
{if (pos == N * N)total++;return;x = pos / N;y = pos % N;if (can_put(x, y))put_chess(x, y);DFS(pos + 1);remove_chess(x, y);
}

上述代码有很多地方可以优化,比如搜索下一个位置就不必再搜索与这个同行的,从而减少很多无用的判断。
而书上给出的算法则没有在一个二维数组中,利用了每行只能摆放一个皇后的性质,只用了一个一维数组用来存储第 i 行中棋子的位置C[i]。

#define MAXN    11
// 使用全局变量减少函数参数数量的增加
int C[MAXN], N, total;void DFS(int deep) 
{if (deep == N)  total++;else for (int i = 0; i < N; ++i) {// 先装模作样的把皇后放在(deep, i)上面,检测是否符合要求,即不冲突C[deep] = i;//bool ok = true;for (int j = 0; j < deep; ++j) {if (C[deep]==C[j]||deep-j==C[deep]-C[j]||deep-j==C[j]- C[deep]){ok = false;break;}}if (ok) DFS(deep + 1);}
}
int main()
{
#ifdef LOCALfreopen("input.txt", "r", stdin);
#endifstd::ios::sync_with_stdio(false);int ns[15];for (N = 1; N <= 10; ++N){total = 0;DFS(0);ns[N] = total;}while (cin >> N && N) {cout << ns[N] << endl;}return 0;
} 

其中判断是否在同一列以及斜线上的条件令我思考了一会,利用了斜率为1和-1的原理,即y1 - y2 == x1 - x2和y1 - y2 == x2 - x1折两个条件判断斜线。另外最开始的代码提交后TLE了,想了想不是C++ cin和cout的问题。我继续搜索题解发现可以先用数组保存结果(因为结果仅仅有10个,从1到10),想想就应该明白测试文件里面会有很多的重复(开始我以为也就是从1测试到10 结束),保存下来应答就不用每次都计算而节省了大量时间。

==================更新=================
另外刘汝佳的书上还介绍了另外一种继续提高效率的做法,使用一个二维数组vis 标记是否被放置过皇后,直接使用一个for循环来判断,代码如下:

void search(int cur)
{if (cur == n)   tot++;else for (int i = 0; i < n; ++i) {if (!vis[0][i] && !vis[1][cur + i] && !vis[2][cur - i + n]) {C[cur] = i;vis[0][i] = vis[1][cur + i] = vis[2][cur - i + n] = 1;search(cur + 1);vis[0][i] = vis[1][cur + i] = vis[2][cur - i + n] = 0;}}
}

并且附带上一句重要的原话:“如果在回溯法中修改了辅助的全局变量,则一定要及时回复原状。特别地,若函数有多个出口,则需在每个出口处恢复被修改的值

这篇关于HDU2553 N皇后问题的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1108055

相关文章

线上Java OOM问题定位与解决方案超详细解析

《线上JavaOOM问题定位与解决方案超详细解析》OOM是JVM抛出的错误,表示内存分配失败,:本文主要介绍线上JavaOOM问题定位与解决方案的相关资料,文中通过代码介绍的非常详细,需要的朋... 目录一、OOM问题核心认知1.1 OOM定义与技术定位1.2 OOM常见类型及技术特征二、OOM问题定位工具

Vue3绑定props默认值问题

《Vue3绑定props默认值问题》使用Vue3的defineProps配合TypeScript的interface定义props类型,并通过withDefaults设置默认值,使组件能安全访问传入的... 目录前言步骤步骤1:使用 defineProps 定义 Props步骤2:设置默认值总结前言使用T

Web服务器-Nginx-高并发问题

《Web服务器-Nginx-高并发问题》Nginx通过事件驱动、I/O多路复用和异步非阻塞技术高效处理高并发,结合动静分离和限流策略,提升性能与稳定性... 目录前言一、架构1. 原生多进程架构2. 事件驱动模型3. IO多路复用4. 异步非阻塞 I/O5. Nginx高并发配置实战二、动静分离1. 职责2

解决升级JDK报错:module java.base does not“opens java.lang.reflect“to unnamed module问题

《解决升级JDK报错:modulejava.basedoesnot“opensjava.lang.reflect“tounnamedmodule问题》SpringBoot启动错误源于Jav... 目录问题描述原因分析解决方案总结问题描述启动sprintboot时报以下错误原因分析编程异js常是由Ja

MySQL 表空却 ibd 文件过大的问题及解决方法

《MySQL表空却ibd文件过大的问题及解决方法》本文给大家介绍MySQL表空却ibd文件过大的问题及解决方法,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友参考... 目录一、问题背景:表空却 “吃满” 磁盘的怪事二、问题复现:一步步编程还原异常场景1. 准备测试源表与数据

解决Nginx启动报错Job for nginx.service failed because the control process exited with error code问题

《解决Nginx启动报错Jobfornginx.servicefailedbecausethecontrolprocessexitedwitherrorcode问题》Nginx启... 目录一、报错如下二、解决原因三、解决方式总结一、报错如下Job for nginx.service failed bec

SysMain服务可以关吗? 解决SysMain服务导致的高CPU使用率问题

《SysMain服务可以关吗?解决SysMain服务导致的高CPU使用率问题》SysMain服务是超级预读取,该服务会记录您打开应用程序的模式,并预先将它们加载到内存中以节省时间,但它可能占用大量... 在使用电脑的过程中,CPU使用率居高不下是许多用户都遇到过的问题,其中名为SysMain的服务往往是罪魁

MySQ中出现幻读问题的解决过程

《MySQ中出现幻读问题的解决过程》文章解析MySQLInnoDB通过MVCC与间隙锁机制在可重复读隔离级别下解决幻读,确保事务一致性,同时指出性能影响及乐观锁等替代方案,帮助开发者优化数据库应用... 目录一、幻读的准确定义与核心特征幻读 vs 不可重复读二、mysql隔离级别深度解析各隔离级别的实现差异

C++ vector越界问题的完整解决方案

《C++vector越界问题的完整解决方案》在C++开发中,std::vector作为最常用的动态数组容器,其便捷性与性能优势使其成为处理可变长度数据的首选,然而,数组越界访问始终是威胁程序稳定性的... 目录引言一、vector越界的底层原理与危害1.1 越界访问的本质原因1.2 越界访问的实际危害二、基

Python多线程应用中的卡死问题优化方案指南

《Python多线程应用中的卡死问题优化方案指南》在利用Python语言开发某查询软件时,遇到了点击搜索按钮后软件卡死的问题,本文将简单分析一下出现的原因以及对应的优化方案,希望对大家有所帮助... 目录问题描述优化方案1. 网络请求优化2. 多线程架构优化3. 全局异常处理4. 配置管理优化优化效果1.