回溯法解八皇后问题

2023-11-01 06:30
文章标签 问题 皇后 回溯 法解

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

暑假过了一半多了,前几天看到八皇后问题,就写了出来,使用回溯法。

八皇后问题:在8*8格的国际象棋上摆放八个皇后,使其不能互相攻击,即任意两个皇后都不能处于同一行、同一列或同一斜线上,问有多少种摆法。

思路:简单的说就是 从当前列中依次选取位置,与前面列中选取的位置进行比较,判断是否冲突,若冲突,回溯到上一列寻找,否则进入下一列寻找位置

   1、从column=0列中选取一个位置,column+1,转到2。(这里column为当前列 值为0~7),

     2、从第column列中选取一个位置,  转到3。

   3、判断是否与前面各列选取位置冲突。

      若冲突:判断column列中位置是否全部判断过,若是 转到5,否则 直接转到2;

      否则:转到4。

   4、判断是否到最后一列。

     若到最后一列说明本次查找成功,记录位置并将结果输出,转到5;

     否则,记录当前位置,进入下一列寻找合适位置,即column+1转到2

   5、判断是否回溯到第一列。

    若是:结束。

    否则:继续回溯,回溯到上一列继续选取位置,即column-1转到2 。

代码如下:

View Code
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace eightQueen
{
//八皇后问题:在8*8格的国际象棋上摆放八个皇后,使其不能互相攻击,
//即任意两个皇后都不能处于同一行、同一列或同一斜线上,问有多少种摆法。
class Program
{
staticvoid Main(string[] args)
{
DateTime time1
= DateTime.Now;
QueenArithmetic(
8); //皇后个数可选
DateTime time2 = DateTime.Now;
TimeSpan span
= time2 - time1;
Console.WriteLine(
"\n执行时间:"+span);
Console.ReadKey();
}

//定义解决皇后问题方法,使用回溯法,根据皇后数量获取结果
staticvoid QueenArithmetic(int queenNum)
{
int[] Queen =newint[queenNum]; //保存每次成功的结果,索引代表所在列,值代表皇后在该列的位置
int row =0; //当前所在的行
int column =0; //当前所在列
Queen[0]=-1;
int count =0; //用来记录当前是第几种摆法

while (true)
{
for (row = Queen[column]+1; row < queenNum; row++) //遍历本次回溯 该列中未被访问到的行
{
if (!IsConflict(Queen, column, row)) //如果不冲突
{
break;
}
}
if (row >= queenNum) //没有找到合适的位置
{
if (column ==0) //如果当前已经回溯到了第一列
{
break; //退出while循环,整个过程结束
}
else
{
Queen[column]
=-1; //否则回溯到上一列
column--;
}
}
else//找到了合适的位置
{
Queen[column]
= row;
column
++; //为下一列找合适位置
if (column < queenNum)//如果当前不是最后一列
{
Queen[column]
=-1;
}
else//说明本次查找完毕,开始打印输出
{
PrintQueen(Queen, queenNum,
++count);//打印输出当前结果
column--; //回溯到上一列继续查找
}
}
}
}

//根据获得的皇后数组,判断当前位置(row,column)是否与前面冲突
staticbool IsConflict(int[] queen, int column, int row)
{
for (int exsitColumn =0; exsitColumn < column; exsitColumn++) //遍历当前列之前的所有列中找到的皇后位置,检测是否与当前位置冲突
{
int exsitRow = queen[exsitColumn];
int span = column - exsitColumn;
if ((row == exsitRow) || (row == exsitRow + span) || (row == exsitRow - span)) //如果在同一行或者同一条斜线上
{
returntrue; //即冲突
}
}
returnfalse;
}

//打印输出结果
staticvoid PrintQueen(int[] queen,int queenNum, int count)
{
Console.WriteLine(
"\n第{0}种摆法:", ++count);
for (int c =0; c < queenNum; c++)
{
for (int r =0; r < queenNum; r++)
{
if (r == queen[c])
{
Console.Write(
"Q");
}
else
{
Console.Write(
"*");
}
}
Console.Write(
"\n");
}
}
}
}

  

 

运行结果(部分):

 初来博客园,还望GGJJ多多指教。

转载于:https://www.cnblogs.com/yinghuochong/archive/2011/08/02/2125490.html

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



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

相关文章

大数据小内存排序问题如何巧妙解决

《大数据小内存排序问题如何巧妙解决》文章介绍了大数据小内存排序的三种方法:数据库排序、分治法和位图法,数据库排序简单但速度慢,对设备要求高;分治法高效但实现复杂;位图法可读性差,但存储空间受限... 目录三种方法:方法概要数据库排序(http://www.chinasem.cn对数据库设备要求较高)分治法(常

Vue项目中Element UI组件未注册的问题原因及解决方法

《Vue项目中ElementUI组件未注册的问题原因及解决方法》在Vue项目中使用ElementUI组件库时,开发者可能会遇到一些常见问题,例如组件未正确注册导致的警告或错误,本文将详细探讨这些问题... 目录引言一、问题背景1.1 错误信息分析1.2 问题原因二、解决方法2.1 全局引入 Element

关于@MapperScan和@ComponentScan的使用问题

《关于@MapperScan和@ComponentScan的使用问题》文章介绍了在使用`@MapperScan`和`@ComponentScan`时可能会遇到的包扫描冲突问题,并提供了解决方法,同时,... 目录@MapperScan和@ComponentScan的使用问题报错如下原因解决办法课外拓展总结@

MybatisGenerator文件生成不出对应文件的问题

《MybatisGenerator文件生成不出对应文件的问题》本文介绍了使用MybatisGenerator生成文件时遇到的问题及解决方法,主要步骤包括检查目标表是否存在、是否能连接到数据库、配置生成... 目录MyBATisGenerator 文件生成不出对应文件先在项目结构里引入“targetProje

C#使用HttpClient进行Post请求出现超时问题的解决及优化

《C#使用HttpClient进行Post请求出现超时问题的解决及优化》最近我的控制台程序发现有时候总是出现请求超时等问题,通常好几分钟最多只有3-4个请求,在使用apipost发现并发10个5分钟也... 目录优化结论单例HttpClient连接池耗尽和并发并发异步最终优化后优化结论我直接上优化结论吧,

Java内存泄漏问题的排查、优化与最佳实践

《Java内存泄漏问题的排查、优化与最佳实践》在Java开发中,内存泄漏是一个常见且令人头疼的问题,内存泄漏指的是程序在运行过程中,已经不再使用的对象没有被及时释放,从而导致内存占用不断增加,最终... 目录引言1. 什么是内存泄漏?常见的内存泄漏情况2. 如何排查 Java 中的内存泄漏?2.1 使用 J

numpy求解线性代数相关问题

《numpy求解线性代数相关问题》本文主要介绍了numpy求解线性代数相关问题,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧... 在numpy中有numpy.array类型和numpy.mat类型,前者是数组类型,后者是矩阵类型。数组

解决systemctl reload nginx重启Nginx服务报错:Job for nginx.service invalid问题

《解决systemctlreloadnginx重启Nginx服务报错:Jobfornginx.serviceinvalid问题》文章描述了通过`systemctlstatusnginx.se... 目录systemctl reload nginx重启Nginx服务报错:Job for nginx.javas

Redis缓存问题与缓存更新机制详解

《Redis缓存问题与缓存更新机制详解》本文主要介绍了缓存问题及其解决方案,包括缓存穿透、缓存击穿、缓存雪崩等问题的成因以及相应的预防和解决方法,同时,还详细探讨了缓存更新机制,包括不同情况下的缓存更... 目录一、缓存问题1.1 缓存穿透1.1.1 问题来源1.1.2 解决方案1.2 缓存击穿1.2.1

vue解决子组件样式覆盖问题scoped deep

《vue解决子组件样式覆盖问题scopeddeep》文章主要介绍了在Vue项目中处理全局样式和局部样式的方法,包括使用scoped属性和深度选择器(/deep/)来覆盖子组件的样式,作者建议所有组件... 目录前言scoped分析deep分析使用总结所有组件必须加scoped父组件覆盖子组件使用deep前言