回溯法解八皇后问题

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

相关文章

解决pandas无法读取csv文件数据的问题

《解决pandas无法读取csv文件数据的问题》本文讲述作者用Pandas读取CSV文件时因参数设置不当导致数据错位,通过调整delimiter和on_bad_lines参数最终解决问题,并强调正确参... 目录一、前言二、问题复现1. 问题2. 通过 on_bad_lines=‘warn’ 跳过异常数据3

解决RocketMQ的幂等性问题

《解决RocketMQ的幂等性问题》重复消费因调用链路长、消息发送超时或消费者故障导致,通过生产者消息查询、Redis缓存及消费者唯一主键可以确保幂等性,避免重复处理,本文主要介绍了解决RocketM... 目录造成重复消费的原因解决方法生产者端消费者端代码实现造成重复消费的原因当系统的调用链路比较长的时

深度解析Nginx日志分析与499状态码问题解决

《深度解析Nginx日志分析与499状态码问题解决》在Web服务器运维和性能优化过程中,Nginx日志是排查问题的重要依据,本文将围绕Nginx日志分析、499状态码的成因、排查方法及解决方案展开讨论... 目录前言1. Nginx日志基础1.1 Nginx日志存放位置1.2 Nginx日志格式2. 499

kkFileView启动报错:报错2003端口占用的问题及解决

《kkFileView启动报错:报错2003端口占用的问题及解决》kkFileView启动报错因office组件2003端口未关闭,解决:查杀占用端口的进程,终止Java进程,使用shutdown.s... 目录原因解决总结kkFileViewjavascript启动报错启动office组件失败,请检查of

SpringBoot 异常处理/自定义格式校验的问题实例详解

《SpringBoot异常处理/自定义格式校验的问题实例详解》文章探讨SpringBoot中自定义注解校验问题,区分参数级与类级约束触发的异常类型,建议通过@RestControllerAdvice... 目录1. 问题简要描述2. 异常触发1) 参数级别约束2) 类级别约束3. 异常处理1) 字段级别约束

Python错误AttributeError: 'NoneType' object has no attribute问题的彻底解决方法

《Python错误AttributeError:NoneTypeobjecthasnoattribute问题的彻底解决方法》在Python项目开发和调试过程中,经常会碰到这样一个异常信息... 目录问题背景与概述错误解读:AttributeError: 'NoneType' object has no at

Spring的RedisTemplate的json反序列泛型丢失问题解决

《Spring的RedisTemplate的json反序列泛型丢失问题解决》本文主要介绍了SpringRedisTemplate中使用JSON序列化时泛型信息丢失的问题及其提出三种解决方案,可以根据性... 目录背景解决方案方案一方案二方案三总结背景在使用RedisTemplate操作redis时我们针对

Kotlin Map映射转换问题小结

《KotlinMap映射转换问题小结》文章介绍了Kotlin集合转换的多种方法,包括map(一对一转换)、mapIndexed(带索引)、mapNotNull(过滤null)、mapKeys/map... 目录Kotlin 集合转换:map、mapIndexed、mapNotNull、mapKeys、map

nginx中端口无权限的问题解决

《nginx中端口无权限的问题解决》当Nginx日志报错bind()to80failed(13:Permissiondenied)时,这通常是由于权限不足导致Nginx无法绑定到80端口,下面就来... 目录一、问题原因分析二、解决方案1. 以 root 权限运行 Nginx(不推荐)2. 为 Nginx

解决1093 - You can‘t specify target table报错问题及原因分析

《解决1093-Youcan‘tspecifytargettable报错问题及原因分析》MySQL1093错误因UPDATE/DELETE语句的FROM子句直接引用目标表或嵌套子查询导致,... 目录报js错原因分析具体原因解决办法方法一:使用临时表方法二:使用JOIN方法三:使用EXISTS示例总结报错原