解题笔记(22)——n后问题

在n×n棋盘上放置n个皇后,要求任意两个皇后不能在同一行、列或对角线上。本文介绍了如何使用回溯法解决八皇后问题,通过逐个放置皇后并检查冲突来寻找解决方案。提供了具体的参考代码实现NQueenProblem(8),用于计算8后问题的解法数量。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

         问题描述:在n×n格的棋盘上放置彼此不受攻击的n个皇后。即任意两个皇后不得处在同一行、同一列或者同一对角斜线上。下图中的每个黑色格子表示一个皇后,这就是一种符合条件的摆放方法。请求出总共有多少种摆法。

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 


    思路:每个皇后都是放在单独的一行,因此同行就不用判断了。用一个数组记录每个皇后可能的列位置,比如Col[0]表示皇后0所在的列号,0到 n-1 之间的值。对于每一种排列,检查是否有在同一列或者同一对角线的两个皇后。产生全排列的算法可以参考字符串的排列。

    这种方法很简单,但是效率太低了。可以改进一下,采用回溯的思想。首先考虑皇后0所在的列号,取0到7的一个。然后考虑皇后1,检查每一个可能的列号,如果与皇后0没有冲突,那么考虑皇后2;如果与皇后0有冲突,那么直接返回,继续考虑已经没有意义。

    参考代码:NQueenProblem(8)计算8后问题

//函数功能 : 检查皇后cur的摆法
//函数参数 : n为皇后数,cur为当前检查的皇后,col为皇后的列位置,sum为找到的摆法
//返回值 :   无
void Queen(int n, int cur, int *col, int *sum)
{
	if(cur == n)  //找到一种摆法
	{
		for(int i = 0; i < n; i++)
			cout<<col[i]<<' ';
		cout<<endl;
		(*sum)++; //摆法加1
		return;
	}
	int i, j;
	for(i = 0; i < n; i++) //考虑每一个可能的列号
	{
		//检查当前考虑的皇后是不是可以放在位置i
		for(j = 0; j < cur; j++)
		{
			if(abs(j-cur) == abs(col[j]-i) || col[j] == i) //与之前的皇后有冲突,不用考虑下一个皇后了
				break;
		}	
		if(j == cur) 
		{
			col[cur] = i;  //可以放在这个位置
			Queen(n, cur+1, col, sum); //考虑下一个皇后
		}
	}
}

//函数功能 : n皇后的摆法
//函数参数 : n为皇后数
//返回值 :   摆法的数量
int NQueenProblem(int n)
{
	int *col = new int[n];
	int sum = 0;
	Queen(n, 0, col, &sum); //调用核心函数
	delete [] col;
	col = NULL;
	return sum;
}

           本人享有博客文章的版权,转载请标明出处 http://blog.youkuaiyun.com/wuzhekai1985

### 关于 WebGoat 中 XXE 漏洞题目的解题思路与练习笔记 #### 什么是 XXE 漏洞? XML 外部实体 (XXE) 漏洞允许攻击者通过恶意构建的 XML 文档利用应用程序解析器的功能,读取本地文件、执行远程代码或发起拒绝服务攻击。这种漏洞通常发生在服务器端未正确配置 XML 解析器的情况下[^1]。 --- #### WebGoat 平台简介 WebGoat 是由 OWASP 提供的一款 Java 应用程序靶场工具,旨在帮助开发者和安全研究人员了解并实践各种 Web 安全漏洞及其防护方法。它涵盖了多种常见漏洞类型,包括但不限于 XSS、SQL 注入以及 XXE 等[^2]。 --- #### WebGoat 中 XXE 题目概述 在 WebGoat 的 XXE 训练模块中,用户可以通过一系列挑战来熟悉如何发现和利用此类漏洞。以下是针对该部分的一些通用解题思路: 1. **理解目标环境** - 分析给定的应用逻辑,确认是否存在对用户提交数据(如上传文件或表单输入)中的 XML 数据进行处理的行为。 - 如果存在,则进一步验证其使用的 XML 解析库是否启用了外部实体加载功能。 2. **构造恶意 payload** 使用标准 DTD(文档类型定义),尝试引入外部资源路径作为测试载体。例如: ```xml <?xml version="1.0" encoding="ISO-8859-1"?> <!DOCTYPE foo [ <!ELEMENT foo ANY > <!ENTITY xxe SYSTEM "file:///etc/passwd"> ]> <foo>&xxe;</foo> ``` 上述代码片段试图从 Linux 文件系统中提取 `/etc/passwd` 文件的内容,并将其嵌套到响应消息体里返回给客户端。 3. **观察反馈结果** 将上述请求发送至目标接口后,仔细查看服务器回传的数据包内容是否有预期敏感信息泄露现象发生;如果没有成功获取所需资料,则需调整策略重新尝试其他可能存在的薄弱环节直至达成最终目的为止。 4. **实施防御措施建议** 当完成所有指定任务之后,还需要掌握有效的缓解办法以防止实际生产环境中再次遭遇类似威胁情况的发生。具体做法如下所示: - 禁止不必要的特性支持——关闭 DOMParser 或 SAXParser 对外网链接地址的支持选项; - 设置严格的白名单机制过滤掉非法字符集编码形式; - 更新第三方依赖版本号保持最新状态从而减少潜在风险暴露面。 --- #### 示例代码展示 下面是一段简单的 Python 脚本用于自动化生成基本类型的 XXE 测试向量: ```python import xml.etree.ElementTree as ET def create_xxe_payload(entity_name, system_id): dtd = f'''<!DOCTYPE root [ <!ENTITY {entity_name} SYSTEM "{system_id}"> ]>''' root = ET.Element('root') tree = ET.ElementTree(root) # Add entity reference inside the element text. root.text = f'&{entity_name};' return '\n'.join([dtd, ET.tostring(root).decode()]) if __name__ == "__main__": print(create_xxe_payload("secret", "file:///C:/Windows/win.ini")) ``` 此函数接受两个参数分别代表自定义标签名称及要访问的目标位置字符串值,最后输出完整的符合要求格式化的 XML 结构化文本串以便后续操作调用。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值