八皇后问题:
在一个8×8国际象棋盘上,有8个皇后,每个皇后占一格;要求皇后间不会出现相互“攻击”的现象,即不能有两个皇后处在同一行、同一列或同一对角线上。问共有多少种不同的方法。
可推广到更一般的n皇后摆放问题。
首先是自己用笔来解一下相对简单的四皇后问题。
从第一行第一列开始,然后考虑下一行。当一行内没有符合条件的格子时,回到上一行,选择原来所选格的后面的格子。当找到一种放法后,把所选格变为考虑过的格,继续检查。直到第一行的所有格都被检查过为止。
我认为,程序中关键部分:
1.找到一行中符合条件的位置后,能往下一行继续判断
2.此行所有的格不能放之后,回到上一行,再检查
3.当找到一种符合条件的方法后,把此格变成已查过的,继续执行1、2。
4.第一行的所有格都检查过,执行结束。
数组标记:0表示此格可放子,1表示此格已放了子,2表示此格不可以放子,3表示此格已经考虑过了
这个问题,还可用其他方法解决,我这个方法和递归相似,均为回溯法的思想。
当n变大时,比如n=15时,共有2279184种方法,同时计算结果的时间也长了,此时,就要可考虑程序的效率问题了,我这个程序,没有考虑效率,所以,还有许多改进的地方。
public class FourQueuen {
private int row=8;//行列数
private int a[][]=new int[row][row];
//0表示此格可放子,1表示子此格已放了子,2表示此格不可以放子,3表示此格已经考虑过
private int sum=0;//计数
private boolean isEnd=false;//是否结束
private int i=0;
public static void main(String[] args) {
FourQueuenV1 fq=new FourQueuenV1();
fq.fourQ();
}
public void fourQ(){
while(isEnd==false){
oneAnswer();
haveChecked();
}
System.out.println("共有"+sum+"种放法");
}
//从第一行找到最后一行,找出一个答案
public void oneAnswer(){
while(i<row){
for(int j=0;j<row;j++){
if(a[i][j]==0){//此点可以放
a[i][j]=1;
notPut(i,j,2);
break; //接着放,下一行
}
if(j==row-1){//最后一个也没找到
i=revive(i);//回到上一行
if(isEnd==true){//第一行全部为3
break;
}
}
}//第一个for
if(isEnd==true){
break;
}
i++;
}//第二个for
if(isEnd!=true){
sum++;
}
}
//接着上一次的继续查找,即把最后一个1改为3
public void haveChecked(){
for(int j=0;j<row;j++){
if(a[row-1][j]==1){
a[row-1][j]=3;//把最后一行的一个1改为3
break;
}
}
//并且从最后一行开始判断
i=row-1;
}
//c行没地方后,回到上一层
public int revive(int c){
if(c>0){//若c=0,则不可能往上一行了,无解
c=c-1;//回到上一行
for(int j=0;j<row;j++){//遍历行,查找1
if(a[c][j]==1){
a[c][j]=3;//表示此格已检查过
//重新设置2和0
for(int p=c+1;p<row;p++){//3以下的行都变为0
for(int q=0;q<row;q++){
a[p][q]=0;
}
}
for(int p=0;p<=c;p++){//重新遍历此表格,到c行就可以了
for(int q=0;q<row;q++){
if(a[p][q]==1){
notPut(p,q,2);//再重新变为2
}
}
}//第二个for
break;//一行只可能有一个1
}// if(a[c][j]==1)
}
c=c-1;//因为i还要加1,所以再-1,才回到这一行
}else if(c==0){
isEnd=true;//第一行全部为3,整个查找结束
}
return c;
}
//此点的shu,xieRight,xieLeft改为num
public void notPut(int c,int d,int num){
shu(c,d,num);
xieRight(c,d,num);
xieLeft(c,d,num);
}
//判断是否能放
public void shu(int c,int d,int num){
for(int i=c+1;i<row;i++){
a[i][d]=num;
}
}
//向右下方
public void xieRight(int c,int d,int num){
for(int i=c+1,j=d+1;i<row&&j<row;i++,j++){//i,j同时+
a[i][j]=num;
}
}
//向左下方
public void xieLeft(int c,int d,int num){
for(int i=c+1,j=d-1;i<row&&j>=0;i++,j--){
a[i][j]=num;
}
}
}
分享到:
相关推荐
在本实验报告“数据结构试八皇后验报告”中,我们将探讨一个经典的数据结构问题——八皇后问题。这个问题源于国际象棋,目标是在8×8的棋盘上放置8个皇后,使得任意两个皇后都不能在同一行、同一列或同一对角线上。 ...
还是先来看看最基础的8皇后问题: 在8X8格的国际象棋上摆放八个皇后,使其不能互相攻击,即任意两个皇后都不能处于同一行、同一列或同一斜线上,问有多少种摆法。 扩展到N皇后问题是一样的。一看,似乎要用到二维...
棋盘覆盖问题是一个经典的计算机科学问题,源自数学中的八皇后问题。它涉及到在8×8的棋盘上放置八个皇后,使得任何两个皇后都不能在同一行、同一列或同一对角线上。这个问题通常用来演示和练习分治算法,因为它可以...
- 回溯与分支限界:用于在庞大的搜索空间中寻找解决方案,如八皇后问题、N皇后问题等。 3. **算法实现与应用**: - 编程语言实现:算法通常用C++、Java、Python等编程语言实现,不同的语言特性可能影响算法的效率...
6. **回溯法和分支限界**:这些算法常用于解决组合优化问题,如八皇后问题、N皇后问题、数独求解等。 7. **字符串处理**:可能包含字符串匹配(如KMP算法、Rabin-Karp算法)、DNA序列分析等问题。 8. **图形用户...
回溯法则用于在搜索树中寻找解,如八皇后问题。分治法则是将复杂问题分解为较小的相似子问题,如快速排序和归并排序。 学习《算法竞赛入门经典——训练指南》的源代码,不仅能够提升编程技能,还可以锻炼解决问题的...
4. **递归与回溯**:用于解决组合优化问题,如八皇后问题、N皇后问题、棋盘覆盖等。 5. **字符串处理**:如KMP算法、模式匹配、字符串反转等。 6. **位运算**:用于高效计算,例如快速幂、求最大公约数和最小公...
常见的应用有八皇后问题、迷宫问题、数独求解等。 6. **分治法**:将大问题分解成小问题来解决,然后合并结果。典型的例子有快速排序、归并排序和大整数乘法。 7. **图论算法**:如最短路径问题(Dijkstra算法、...
回溯法在解决迷宫问题、八皇后问题等有大量无效解的问题时广泛应用。其基本思想是在搜索过程中遇到困境时,回溯到上一步或更早的状态,继续寻找其他可能的分支。 递归算法是利用函数自身调用来解决问题的方法。在...
更高级的算法包括动态规划(用于背包问题、最长公共子序列等)、贪心算法(如霍夫曼编码、Prim算法构建最小生成树)和回溯法(八皇后问题、N皇后问题)。这些算法的掌握程度直接影响到解题的效率和质量。 在C++编程...
回溯是一种试探性解决问题的方法,如八皇后问题、迷宫求解。 8. **数据结构设计与分析**:设计数据结构时要考虑其实现的复杂度,包括时间复杂度和空间复杂度。分析数据结构性能通常使用大O符号,如O(1)常数时间、O...
4. 回溯法:通过试探性的解决问题,当发现不满足条件时回溯尝试其他路径,如八皇后问题、图的着色问题。 5. 模拟法:直接按照问题描述的步骤进行模拟,如电梯调度问题、列车调度问题。 四、经典算法详解 1. 排序...
八皇后问题是在8x8的棋盘上放置8个皇后,使得任何两个皇后都无法在同一行、同一列或对角线上攻击彼此。 - 在回溯法中,通常包括以下几个步骤:选择一个可能的解决方案元素,检查其可行性,若可行则继续填充下一个...
- **回溯法**:用于解决约束满足问题,如八皇后问题、数独等。 4. **其他高级数据结构**: - **红黑树**:自平衡二叉查找树,保证插入和删除操作的高效性。 - **B树和B+树**:用于数据库索引,支持快速查找大...
最后,递归与回溯也是算法题目的重要组成部分,例如八皇后问题、N皇后问题、迷宫问题等。掌握递归的思想和剪枝技巧,能帮助你在解决这些问题时避免无效计算。 通过《蓝桥杯习题集》的练习,不仅可以提升你的编程...
它常用于解决约束满足问题和组合优化问题,如八皇后问题、N-皇后问题等。 以上知识点是PPT内容的精华所在,深入学习和掌握这些算法分析技巧,不仅能够提升编程能力,更能培养出解决复杂问题的系统思维。对于计算机...
8. **回溯法与分支限界法**:用于解决组合优化问题,如八皇后问题、N-皇后问题、旅行商问题。 9. **图论应用**:如最小生成树(Kruskal算法、Prim算法)、最短路径(Dijkstra算法、Floyd-Warshall算法)、网络流...
9. **回溯法**:用于解决约束满足问题,如八皇后问题、N皇后问题、棋盘覆盖问题等。 10. **概率与随机化算法**:如鸽巢原理、随机化算法(如Monte Carlo方法、Las Vegas方法)的应用。 复习这些知识点时,不仅要...
它在解决组合优化问题,如八皇后问题和N皇后问题,以及迷宫问题中非常有效。 贪心策略则是在每个步骤都选择当前看起来最优的选择,而不考虑长远影响。贪心算法可以用于解决区间调度、霍夫曼编码和最小生成树等问题...
6. 棋盘类问题:如八皇后问题、骑士周游问题等,这类问题往往需要对棋盘上的位置进行状态编码,然后通过动态规划找出所有可能的解决方案。 在学习动态规划的过程中,理解并熟练应用以下关键概念至关重要: - 状态...