算法一之N皇后问题

(写这篇文章主要是明天就要考试了,算法考试,今天不想再复习了,xiang着今天也开通了博客,于是在这个平台上进行复习,应该会更高效。最后祝愿我明天考个好成绩。嘻嘻。。。)

n皇后问题,主要是应用到回溯法。首先选取一条路径进行计算,如果不满足条件则,进行回溯,选择另外的路径进行计算。

我觉得回溯法:就想是在走迷宫,先选取一条路进行走,如果不能走通,就返回,在选择路口的地方,选择其他的路口,如果能走通,就说明路径选择正确。也就是说找到了解决问题的方法。

下面进行代码分析与解决:

问题分析,n皇后问题,问题分析不用说了,主要是进行伪代码的分析与求解。不同行,不同列,不在同一斜线上。

应用到SPARKS 语言

(1)判断一个地方是否可以放置一个皇后

procedure PLACE(k)

global X(k);integer i,k;//X(l)放置皇后的数列,下标是皇后放置的行,X(i)是皇后放置的列

i<-1;

for i<k do

  if X(i)=X(k) or ABS(i-k)=ABS(X(i)-X(k))//判断第k个皇后与前面的k-1个皇后是否冲突。ABS:是判断是否在同一斜线上。

    then return (false)

  endif

  i<-i+1;

repeat

return (true);

end PLACE

(2)n皇后问题的解决

procedure NQUEENS(n)

  global k,n,X(1:n)//k是当前行,X(k)是当前列

  X(1)<-0;K<-1;

  while k>0 do//对所有行进行如下操作

    X(k)<-X(k)+1//移到下一列

    while X(k)<=n and not PLACE(k) do//如果当前位置不能放移到下一列

      X(k)<-X(k)+1

    repeat

  //当前位置能进行放置

  if X(k)<=n//当前列必须满足小于n

    then if k=n  //判断是否为一个完整的解。

      then print(X)//是,输出解

      else k<-k+1,X(k)<-0;//否,移动到下一行,列从头开始

      endif

  else k<-k-1//不满足,说明这样不能满足解。所以进行回溯。

  endif

  repeat

end NQUEENS

···············································································································

好了,一个问题已经解决了。下面在回顾一下。

这个问题理解了也不是那么麻烦。明天考试要注意的地方有哪些呢?

  一条路走到底,碰到南墙回头,找到另外的路径。

最后明天考个好成绩。进行下一算法的分析计算。加油!!!!

时间: 2024-10-06 03:42:06

算法一之N皇后问题的相关文章

数据结构与算法一

题目一:求1!+2!+-..+n! 的和的后6位,(注意n的范围) #include <iostream> using namespace std; const int MAX = 1000000; int getResu(int n) { int sum=0; int temp= 1; for(int i=1; i <= n; i++) { temp *= i; temp %= MAX; sum += temp; sum %= MAX; } return sum ; } int mai

大数据处理算法一:Bitmap算法

腾讯面试题:给20亿个不重复的unsigned int的整数,没排过序的,然后再给一个数,如何快速判断这个数是否在那40亿个数当中并且所耗内存尽可能的少? 解析:bitmap算法就好办多了 所谓bitmap,就是用每一位来存放某种状态,适用于大规模数据,但数据状态又不是很多的情况.通常是用来判断某个数据存不存在的. 例如,要判断一千万个人的状态,每个人只有两种状态:男人,女人,可以用0,1表示.那么就可以开一个int数组,一个int有32个位,就可以表示32个人.操作的时候可以使用位操作. 一,

区块链入门教程以太坊源码分析fast sync算法一

区块链入门教程以太坊源码分析fast sync算法一,2018年下半年,区块链行业正逐渐褪去发展之初的浮躁.回归理性,表面上看相关人才需求与身价似乎正在回落.但事实上,正是初期泡沫的渐退,让人们更多的关注点放在了区块链真正的技术之上.this PR aggregates a lot of small modifications to core, trie, eth and other packages to collectively implement the eth/63 fast synch

js 算法一

1 写一个函数,去掉a数组中和b数组中相同的元素. 思路一:让a数组中的元素和b数组中的元素逐个比较,若相同,则删除. 方法一: function array_diff(a, b){ for(var i = 0; i < a.length; i++){ for(var j = 0; j < b.length; j++){ if(a[i] == b[j]){ a.splice(a.indexOf(b[j]), 1); //删除 j = -1; //必须保证a中的每一个元素都从b的第一个元素开始遍

Solr相似度算法一:Lucene TF-IDF 相关性算分公式

Lucene在进行关键词查询的时候,默认用TF-IDF算法来计算关键词和文档的相关性,用这个数据排序 TF:词频,IDF:逆向文档频率,TF-IDF是一种统计方法,或者被称为向量空间模型,名字听起来很复杂,但是它其实只包含了两个简单规则 某个词或短语在一篇文章中出现的次数越多,越相关 整个文档集合中包含某个词的文档数量越少,这个词越重要 所以一个term的TF-IDF相关性等于 TF * IDF 这两个规则非常简单,这就是TF-IDF的核心规则,第二个的规则其实有缺陷的,他单纯地认为文本频率小的

PCB 板边倒圆角的实现方法(基本算法一)

当PCB外形是直角时,通常工程制作外形(锣带)时,会将直角或尖角的地方倒成圆角,主要是为了防止板边容易划伤板且容易扎伤人 所以当客户没有特殊要求时,PCB外形是直角一般会默认倒角0.5mm圆角(如下图所示)  一.PCB板边倒圆角点分析 原PCB外形  如下图图示:看了这个PCB外形,产生有2个问题点. 1.外形中哪些点需倒圆角? 2.如何怎么倒圆角? 1.外形中哪些点需倒圆角? 看下图: PCB外形倒圆角的点,刚好就是我们凸包需求出的点,接下来我们将玩转凸包了,只要求出凸包,那么就可以实现PC

排序算法一:插入排序(Insertion sort)

最近从网易公开课在看麻省理工学院的公开课<算法导论>,感觉还不错,接下来几篇文章所示学习日记了,不准备对算法细节做过多描述,感兴趣的可以自己去看. 文章分几篇讲经典排序算法,直接上代码,根据结果对算法性能有个直观了解.本篇先说插入排序(insertion sort). (一)算法实现 1 protected void sort(int[] toSort) { 2 if (toSort.length <= 1) { 3 return; 4 } 5 for (int i = 1; i <

泛型算法一

1.accumulate:计算给定区间值的累加和 2.函数原型(#include <numeric>) template<class InputIterator, class Type> Type accumulate( InputIterator _First, InputIterator _Last, Type _Val ); template<class InputIterator, class Type, class BinaryOperation> Type

最大流学习笔记(5)-前置重贴标签算法一

上一篇 1.许可边:设$f$是流网络G的一个预流,$h$是高度函数.对于边$(u,v)$,如果$c_{f}(u,v)>0$且$h(u)=h(v)+1$,那么边$(u,v)$是一个许可边.否则是非许可边.许可网络$G_{f,h}=(V,E_{f,h})$,$E_{f,h}$是许可边的集合 2.许可网络是有向无环的.因为对于每条许可边$(u,v)$来说,$h(u)=h(v)+1$,所以如果存在环,设环的大小是$k$,那么最后会有$h(u)=h(u)+k$.这是不满足的. 3. 如果$u$是溢出节点,