题目:
由八皇后问题扩展开来,即n*n的棋盘上摆放n个皇后,使其不能互相攻击,即任意两个皇后都不能处于同一行、同一列或同一斜线上,问有多少种摆法。
分析:
问题可以转化为12345...n 的满足某种条件(行已不等,列亦不等,只需设定其不在同一斜线上,即斜率不为 1 或-1 )的排列.
代码:
Private Sub queensn(ByVal n As Integer, ByRef result() As String) '计算n皇后问题的过程
Dim i As Long, J As Integer, k As Integer, number As Long, num As Long '循环变量
Dim FIT As Boolean '判定是否符合条件
Dim ALL(), out() As String '用于输出的数组
ReDim ALL(1 To n)
ReDim out(1 To n)
number = 1
Dim TEMP1 As Long, TEMP2 As Integer '进制转换中间变量
For i = 1 To n
number = number * i ' get n!
Next
For i = 1 To number ' 穷举n!种排列
ALL(1) = 1
TEMP1 = i
For J = 2 To n
TEMP2 = TEMP1 Mod J '混合进制
TEMP1 = TEMP1 \ J
If TEMP2 = 0 Then
ALL(J) = J 'temp2为 0则放在最后
Else
For k = J To TEMP2 + 1 Step -1
ALL(k) = ALL(k - 1) ' temp2之后的元素后移一位
Next
ALL(TEMP2) = J 'temp2不为 0 则置于第temp2个元素前
End If
Next '至此得到12345...n的一个排列
FIT = True '初始化变量
'循环判断有否两个皇后存在互吃
For J = 1 To n
For k = n To 1 Step -1
If Not k = J Then
If ALL(k) - ALL(J) = J - k Or ALL(k) - ALL(J) = k - J Then
FIT = False
GoTo pass '跳出循环
End If
End If
Next
Next
If FIT Then '满足条件时
num = num + 1 '输出编号
ReDim Preserve result(1 To num)
For J = 1 To n
out(J) = String(n, StrConv("□", vbWide))
Mid(out(J), ALL(J), 1) = StrConv("Q", vbWide)
Next
result(num) = "第" & num & "种方法:" & vbCrLf & Join(out, vbCrLf) '输出第 num 种 n 个皇后摆放状态
End If
pass:
Next
End Sub
Private Sub Command1_Click()
Dim result() As String
queensn 9, result '九皇后
Open "d:\result.txt" For Binary As #1
Put #1, , Join(result, vbCrLf)
Close #1
MsgBox "ok"
End Sub
分享到:
相关推荐
在本例中,我们关注的是一个经典的计算机科学问题——n皇后问题。n皇后问题是一个在n×n棋盘上放置n个皇后,使得皇后之间不能互相攻击的问题。这里的“攻击”指的是皇后可以沿着行、列或对角线攻击到其他皇后。 n...
### N皇后问题实验报告知识点解析 #### 一、实验目的及要求 本次实验的主要目的是让学生通过实际编程操作,深入理解并解决N皇后问题。实验要求包括以下几点: 1. **了解皇后相互攻击的条件**:当两个皇后位于同一...
在这个场景中,我们关注的是“n皇后问题”。n皇后问题是在一个n×n的棋盘上放置n个皇后,要求任何两个皇后不能处于同一行、同一列或同一对角线上。** **C++是实现这一算法的理想选择,它是一种静态类型的、编译式的...
n 皇后问题是一道经典的回溯算法问题,其目标是在一个 � × � n×n 的棋盘上放置 � n 个皇后,使得任意两个皇后都不能在同一行、同一列或同一斜线上。 栈可以用来辅助实现回溯算法,本质上就是手动维护了递归...
n皇后问题C++源码。{典型的8皇后问题的扩展)
N皇后问题是一个经典的计算机科学问题,它源自国际象棋,目标是在一个N×N的棋盘上摆放N个皇后,使得任何两个皇后都无法通过同一行、同一列或同一对角线互相攻击。这个问题展示了如何利用回溯算法或者深度优先搜索...
**n皇后问题**是计算机科学中的一个经典问题,它的目标是在一个n×n的棋盘上放置n个皇后,使得任何两个皇后都不会在同一行、同一列或同一对角线上相互攻击。这个问题通常用来演示回溯算法和深度优先搜索(DFS)在...
**C语言解决n皇后问题详解** n皇后问题是一个经典的回溯法问题,它涉及到在n×n的棋盘上放置n个皇后,使得任意两个皇后都不能在同一行、同一列或同一对角线上。以八皇后问题为例,即在8×8的棋盘上放置8个皇后,找...
n皇后问题是一个经典的计算机科学问题,它在棋盘上放置n个皇后,要求任何两个皇后不能在同一行、同一列或同一斜线上。这个问题是回溯算法和分支限界法的良好应用实例,旨在展示如何在有限的搜索空间中找到所有可能的...
**CSP最小冲突法解决n皇后问题** 在计算机科学领域,**CSP(Constraint Satisfaction Problem,约束满足问题)**是一种常见的问题求解框架,用于处理一系列条件或限制下的变量分配问题。n皇后问题是一个经典的CSP...
回溯算法是一种基于深度优先搜索的算法,常用于解决复杂问题的求解,例如N皇后问题。N皇后问题是在一个N×N的棋盘上放置N个皇后,要求任何两个皇后不能处于同一行、同一列或同一斜线上,找出所有可行的解决方案。此...
根据给定的信息,本文将详细解释“N皇后问题”及其回溯法求解方案。 ### N皇后问题概述 N皇后问题是指在一个N×N的棋盘上放置N个皇后,使得任意两个皇后都不会互相攻击(即任何两个皇后不能位于同一行、同一列或...
N皇后问题C++代码 N皇后问题是计算机科学中的一种经典问题,旨在在N*N的棋盘上摆放N个皇后,使得每个皇后不在同一行、同一列或同一对角线上。下面是使用C++语言实现的N皇后问题的解决方案。 类的设计 在解决N皇后...
### n皇后问题回溯法解析 #### 一、问题背景及定义 n皇后问题是一个经典的计算机科学问题。问题描述为:在n×n的棋盘上放置n个皇后,要求这些皇后不能处于同一行、同一列或同一斜线上。本问题通过C++编程语言采用...
n皇后问题代码 回溯法 递归回溯 算法设计与分析
n皇后问题C++实现 n皇后问题是计算机科学中的一种经典问题,旨在寻找一种算法,可以将n个皇后摆放在n*n的棋盘上,使得每个皇后不在同一行、同一列或同一斜线上。该问题的解决需要使用回溯法,首先初始化一个一维...
这些算法在解决复杂问题时展现出强大的能力,特别是对于NP完全问题,如N皇后问题。N皇后问题是一个经典的问题,目标是在一个n×n的棋盘上放置n个皇后,使得任意两个皇后之间都不能互相攻击,即不存在同行、同列或对...
在编程领域,解决复杂问题的方法多种多样,其中“N皇后问题”是一个经典的示例,它展示了不同的编程策略和设计模式。本篇文章将深入探讨“黑板风格”、“管道风格”、“调用返回风格”以及“回溯法”这四种方法在...
**N皇后问题**是计算机科学领域中一个经典的回溯算法问题,它的目标是在一个N×N的棋盘上放置N个皇后,使得任意两个皇后都无法在同一行、同一列或同一条对角线上互相攻击。这个问题在Java编程中具有重要的学习价值,...