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

漯河网做网站广州最新重大新闻

漯河网做网站,广州最新重大新闻,贸易公司怎么做网站比较好,新闻今日头条最新消息N皇后问题是一个经典的算法问题,要求在NN的棋盘上放置N个皇后,使得它们互不攻击。本文将全面解析该问题的解法,特别聚焦于DFS算法和对角线优化的数学原理。 问题描述 在NN的国际象棋棋盘上放置N个皇后,要求: 任意两个…

N皇后问题是一个经典的算法问题,要求在N×N的棋盘上放置N个皇后,使得它们互不攻击。本文将全面解析该问题的解法,特别聚焦于DFS算法和对角线优化的数学原理。

问题描述

在N×N的国际象棋棋盘上放置N个皇后,要求:

  • 任意两个皇后不在同一行

  • 任意两个皇后不在同一列

  • 任意两个皇后不在同一对角线

数据结构图解

1. 棋盘表示

char g[N][N];  // 棋盘矩阵
  • '.' 表示空位

  • 'Q' 表示皇后

示例(n=4初始状态):

. . . .
. . . .
. . . .
. . . .

2. 冲突检测数组

bool col[N];       // 列占用标记
bool dg[N*2];      // 正对角线占用标记
bool udg[N*2];     // 反对角线占用标记
对角线索引计算:
(0,0) (0,1) (0,2) (0,3)
(1,0) (1,1) (1,2) (1,3)
(2,0) (2,1) (2,2) (2,3)
(3,0) (3,1) (3,2) (3,3)
  • 正对角线(dg)u + i(行+列)

    • 例如:(1,2)的正对角线索引=1+2=3

    • 我们发现同一个对角线的上的坐标的x,y值相加是相等的,所以我们用dg[u+i]去标记

  • 反对角线(udg)n - u + i

    • 例如:当n=4时,(1,2)的反对角线索引=4-1+2=5

    • 反对角线,我们此时不能再次使用u+i了 

    • 但为了确保索引不重叠,我们使用n - u + i

      • u增加时,n - u减小

      • i增加时,i增大

      • 这样确保每条反对角线有唯一索引

    • 实际计算示例(n=4)

      坐标计算式索引值
      (0,3)4-0+3=77
      (1,2)4-1+2=55
      (2,1)4-2+1=33
      (3,0)4-3+0=11

算法执行流程图解

DFS递归过程

dfs(0)
├─ 尝试第0行第0列
│  ├─ 放置皇后
│  ├─ dfs(1)
│  │  ├─ 尝试第1行第2列
│  │  │  ├─ 放置皇后
│  │  │  ├─ dfs(2)
│  │  │  │  ├─ (冲突,回溯)
│  │  │  └─ 撤销皇后
│  │  └─ 尝试其他列...
│  └─ 撤销皇后
└─ 尝试第0行第1列├─ 放置皇后├─ dfs(1)│  ├─ 尝试第1行第3列│  │  ├─ 放置皇后│  │  ├─ dfs(2)│  │  │  ├─ 找到解│  │  │  └─ 输出棋盘│  │  └─ 撤销皇后│  └─ 尝试其他列...└─ 撤销皇后

示例解(n=4)

有效解之一:

. Q . .
. . . Q
Q . . .
. . Q .

对应的标记数组状态:

  • col: [1, 0, 1, 0] (第0、2列被占用)

  • dg: 索引1、3、4被占用

  • udg: 索引4、5、6被占用

完整代码

/*DFS			深度优先搜索*/
#include <stdio.h>
#include <stdbool.h>#define N 20int n;				//棋盘的大小(n*n)
char g[N][N];		//模拟棋盘,'.'表示空,'Q'表示皇后
//col表示列是否被占用,dg表示正对角线是否被占用,udg表示反对角线是否被占用
bool col[N], dg[N*2], udg[N*2];		void dfs(int u)	//u表示当前处理的行
{if (u == n)		//所有的行处理完毕,输出解,返回递归{for (int i = 0;i < n;i++)	//puts函数输出字符串,自动换行puts(g[i]);				//在二维数组g[][]中,单使用g[i]表示第i行的所有数据puts("");		//打印空格,隔开不同解return;}//尝试在当前行的每一列放置皇后for(int i = 0;i < n;i++)//检查列,正对角线,反对角线是否冲突if (!col[i] && !dg[u + i] && !udg[n - u + i]){g[u][i] = 'Q';		//防止皇后col[i] = dg[u + i] = udg[n - u + i] = true;		//标记占用dfs(u + 1);			//递归处理下一行col[i] = dg[u + i] = udg[n - u + i] = false;	//回溯,撤销原有的标记g[u][i] = '.';		//恢复棋盘}
}int main()
{scanf("%d", &n);//初始棋盘for (int i = 0;i < n;i++)for (int j = 0;j < n;j++)g[i][j] = '.';//从第0行开始DFSdfs(0);return 0;
}

时间复杂度分析

  • 最坏情况:O(n!)(需要尝试所有可能的排列)

  • 实际由于剪枝(冲突检测),运行效率高于纯暴力搜索

关键点总结

  1. 行处理顺序:逐行放置皇后,避免行冲突

  2. 冲突检测

    • 列冲突:col[i]

    • 正对角线冲突:dg[u+i]

    • 反对角线冲突:udg[n-u+i]

  3. 回溯机制:递归返回时撤销所有修改

这个算法通过DFS系统地探索所有可能的解空间,同时使用剪枝技术大幅提高效率。

http://www.dtcms.com/wzjs/11087.html

相关文章:

  • 网站主题有哪些内容各平台推广费用
  • 企业门户网站模板分享百度站长工具app
  • 网站托管服务方案3d建模培训学校哪家好
  • 如何做招商性网站saas建站
  • 东莞做网站企业铭陕西seo排名
  • 中小企业官方网站seo网站优化技术
  • 支持支付宝登录的网站建设东莞快速优化排名
  • 工程建设内容包括哪些seo人员培训
  • 日照便宜做网站软文素材库
  • 论坛做视频网站有哪些开鲁网站seo转接
  • 我想阻止一个网站要怎么做北京seo做排名
  • 修改图片网站网站优化推广的方法
  • 互联网营销师是我国哪一年发布的新职业seo 知乎
  • 网站建设时送的ppt方案教育培训加盟
  • 义乌小商品批发网上进货网址seo优化排名
  • 济南企业做网站如何建立免费公司网站
  • 网站建设和管理工作网页设计费用报价
  • 东莞手机网站如何做谷歌seo推广
  • 政府网站建设法律法规怎么申请域名建网站
  • 成都建设网站公司哪家好app推广拉新接单平台
  • wordpress广告公司模板武汉seo关键词排名
  • 北京轨道交通建设公司网站拼多多seo怎么优化
  • 如何帮人做网站赚钱吗推广引流吸引人的文案
  • asp与php做网站哪个好永久开源的免费建站系统
  • 贵州企业展示型网站建设在哪个网站可以免费做广告
  • 中华南大街网站建设百度关键词收录排名
  • 国外网站 备案宁波seo排名优化
  • 专门做win7系统的网站百度搜索引擎排名规则
  • 可以盗链图片的网站郑州网站优化顾问
  • 12306网站开发时间域名查询 ip