N皇后问题

除了暴力回溯探测思想之外,还要能够掌握并使用每一条对角线与i,j下标的关系。

每一行只能有一个皇后 -> 通过每次for只给一行填一个;

每一列只能有一个皇后->通过col[n]数组来标记,哪一列放了皇后,相应的col[i] = 1;

每一 \ 这种斜列只能有一个皇后 ->总共有 dia2[2n-1] 个 \ 线,每一条线上的i,j有性质:i - j + n - 1 对于每一条 \ 总是相等的;

每一 / 这种斜列只能有一个皇后 -> 总共有dia1[2n-1] 个/ 线,每一条 / 上的个子i,j有性质:i + j对于每一条 / 上的格子总是相等的。

 

package main

import (
	"strings"
	"fmt"
)

var res [][]string
var col, dia1, dia2 []bool

func main() {
	var n = int(8)
	solveNQueens(n )
	for i := range res {
		for j := range res[i] {
			fmt.Println(res[i][j])
		}

		fmt.Println()
	}

}

func solveNQueens(n int) [][]string {
	var solveRow []int
	col = make([]bool, n)
	dia1 = make([]bool, 2*n-1)
	dia2 = make([]bool, 2*n-1)
	putQueens(n, 0, solveRow )

	return  res
}

func putQueens(n, index int, row []int ) {

	if index == n {
		res = append(res, saveAsolve(n, row))
		return
	}

	for i := 0; i < n; i++ {
		if !col[i] && !dia1[index+i] && !dia2[index-i+n-1] {
			row = append(row, i)
			col[i] = true
			dia1[index+i] = true
			dia2[index-i+n-1] = true
			putQueens(n, index+1, row)
			col[i] = false
			dia1[index+i] = false
			dia2[index-i+n-1] = false
			tmpLen := len(row)
			row = row[:tmpLen-1]
		}
	}

	return
}

func saveAsolve(n int, row []int) []string  {
	res1 := make([]string, n)
	for i := range res1 {
		for j := 0; j < n ; j++ {
			res1[i] = strings.Repeat(".", n)
		}
	}

	for i := 0; i < n; i++ {
		tmp := res1[i]
		c := []byte(tmp)
		c[row[i]] = 'Q'
		res1[i] = string(c)
	}

	return res1
}

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值