swift未解决八皇后的问题代码

问题描述

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

代码问题:
用下面我自己的方法实现的八皇后,结果出现了无尽的循环。可能是思路还是哪里的不严谨?请教大伙帮忙改改!我已经尽力了。。。

注:
代码可以直接粘贴复制进xcode的playground进行测试!

class ChessBoard {

var limit: Intvar queens = [Queen]()init(limit: Int) {    self.limit = limit}// 判断该位置是否可以放下皇后func isSafeForQueen(atRow row: Int col: Int) -> Bool {    for q in queens {        // 该行中有皇后        if q.row == row { return false }        // 该列中有皇后        if q.col == col { return false }        // 该对角线上有皇后        // 棋盘上两棋子(ij)(ab)满足在同一对角线的条件:|i-a| == |j-b|        if abs(q.row-row) == abs(q.col-col) { return false }    }    return true}// 递归方法:func dropQueen(atRow r: Int c: Int) {    // 进行到最后一行    if r == limit {        if queens.count < 8 {            queens.removeLast()            let q = queens.last!            dropQueen(atRow: q.row c: q.col+1)        }        output() // 如果成功放置8个皇后,就输出结果        return    }    // 进行到该行最后一列    if c == limit {        queens.removeLast()        let q = queens.last!        // 返回上一行        dropQueen(atRow: r-1 c: q.col+1)    }    // 判断在(rc)位置是否能放皇后,如果可以,就递归下一行;如果不行,就判断下一个点    if isSafeForQueen(atRow: r col: c) {        let q = Queen(row: r col: c)        queens.append(q)        dropQueen(atRow: r+1 c: c)    } else {        dropQueen(atRow: r c: c+1)    }}func play() {    dropQueen(atRow: 0 c: 0) // 从(00)开始}func output() -> String {    var s = """"    for q in queens {        s += ""((q.row)(q.col))""    }    return s}

}

struct Queen {
var row: Int
var col: Int
}

// 测试:
let b = ChessBoard(limit: 8)
//b.play()

解决方案

这里有个objective-c版的eight queens,可以参考
http://ijoshsmith.com/2012/04/22/objective-c-genetic-algorithm-that-solves-the-8-queens-puzzle/

时间: 2024-08-31 01:19:27

swift未解决八皇后的问题代码的相关文章

python基于右递归解决八皇后问题的方法

  本文实例讲述了python基于右递归解决八皇后问题的方法.分享给大家供大家参考.具体分析如下: 凡是线性回溯都可以归结为右递归的形式,也即是二叉树,因此对于只要求一个解的问题,采用右递归实现的程序要比回溯法要优美的多. ? 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 def Test(queen,n): '''这个就不用说了吧,就是检验第n(下标,0-7)行皇后的位置是否合理''' q=que

C#用递归算法解决八皇后问题_C#教程

1.引子 中国有一句古话,叫做"不撞南墙不回头",生动的说明了一个人的固执,有点贬义,但是在软件编程中,这种思路确是一种解决问题最简单的算法,它通过一种类似于蛮干的思路,一步一步地往前走,每走一步都更靠近目标结果一些,直到遇到障碍物,我们才考虑往回走.然后再继续尝试向前.通过这样的波浪式前进方法,最终达到目的地.当然整个过程需要很多往返,这样的前进方式,效率比较低下. 2.适用范围 适用于那些不存在简明的数学模型以阐明问题的本质,或者存在数学模型,但是难于实现的问题. 3.应用场景 在

python 示例分享---逻辑推理编程解决八皇后_python

可以和Haskell , Prolog 一样做到模式匹配, 建立逻辑推到规则,描述问题,得出答案. from pyDatalog import pyDatalog pyDatalog.create_atoms( 'N, N1, X, Y, X0, X1, X2, X3, X4, X5, X6, X7' ) pyDatalog.create_atoms( 'ok, queens, next_queen, pred, pred2' ) size = 8 ok( X1, N, X2 ) <= ( X1

八皇后问题实现代码分享_C 语言

main.cpp 复制代码 代码如下: #include<iostream>#include<cstring> using namespace std; const int N = 7; int count = 0; void QueenPrint(int LayOut[N][N])  //打印结果{ cout<<"第"<<++count<<"种布局:"<<endl; for(int i = 0

递归-(已解决)自己用java写的八皇后问题算法,可是不行,求告知原因

问题描述 (已解决)自己用java写的八皇后问题算法,可是不行,求告知原因 public class Test { public static void main(String[] args) { Empress a=new Empress(); a.find(0,0); System.out.println(a.map); } } class Empress{ public int[][] arry=new int[8][8]; public int map=0; public boolean

UVa 639:Don&#039;t Get Rooked, 类八皇后问题

题目链接: http://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&category=108&page=show_problem&problem=580 题目类型: 暴力, 回溯法 题目: In chess, the rook is a piece that can move any number of squares vertically or horizontally. In this p

常用算法:C#八皇后问题

八皇后问题是一个古老而著名的问题,是回溯算法的典型应用.八皇后问题就是棋盘上的8个皇后不能在同一行.一列或一条斜线上,在8!=40320种排列中共有92种解决方案.代码如下: using System; using System.Collections.Generic; using System.Text;namespace ExQueen { class Queen { public void QueenArithmetic(int size){ int[] Queen = new int[s

javascript递归回溯法解八皇后问题_javascript技巧

下面给大家分享的是回溯法解八皇后, 带详细注解,这里就不多废话了. function NQueens(order) { if (order < 4) { console.log('N Queens problem apply for order bigger than 3 ! '); return; } var nQueens = []; var backTracking = false; rowLoop: for (var row=0; row<order; row++) { //若出现ro

c++递归实现n皇后问题代码(八皇后问题)_C 语言

还是先来看看最基础的8皇后问题: 在8X8格的国际象棋上摆放八个皇后,使其不能互相攻击,即任意两个皇后都不能处于同一行.同一列或同一斜线上,问有多少种摆法. 扩展到N皇后问题是一样的.一看,似乎要用到二维数组.其实不需要.一维数组就能判断,比如Arr[i],就可以表示一个元素位于第i行第Arr[i]列--应用广泛的小技巧.而且在这里我们不用考虑去存储整个矩阵,如果Arr[i]存在,那么我们在打印的时候,打印到皇后位置的时候输出1,非皇后位输出0即可. 这种思路的实现方式网上大把,包括前面提到的那