题解 | N皇后问题

N皇后问题

https://www.nowcoder.com/practice/fc1a671e4abf49048945432c5b738dbd

package main

import (
	"bufio"
	"fmt"
	"os"
	"strconv"
)

func main() {
	for {
		scanner := bufio.NewScanner(os.Stdin)

		// 设置大缓冲区,防止大输入时出错
		buf := make([]byte, 1024*1024) // 1MB
		scanner.Buffer(buf, 1024*1024)
		scanner.Split(bufio.ScanWords) // 按单词扫描(空格、换行等分隔)

		// 读取第一行:n
		scanner.Scan()
		n, _ := strconv.Atoi(scanner.Text())
		if n == 0 {
			break
		}

		// n = 3
		// [0,0] [0,1], [0,2]
		// [1,0] [1,1], [1,2]
		// [2,0] [2,1], [2,2]
		// min := 0
		// max := 4
		col := make([]bool, n)
		dui1 := make([]bool, 2*n-1) // i-j+n-1 右下角斜线
		dui2 := make([]bool, 2*n-1) // i+j 左下角斜线
		fmt.Println(process(n, 0, col, dui1, dui2))
	}
}

func process(n int, row int, col, dui1, dui2 []bool) int {
	if n == row {
		return 1
	}

	sum := 0
	for i := 0; i < n; i++ {
	    // 判断是否能够放置
		if col[i] || dui1[row-i+n-1] || dui2[i+row] {
			continue
		}
		col[i] = true
		dui1[row-i+n-1] = true
		dui2[i+row] = true
        // 累加可能性
		sum += process(n, row+1, col, dui1, dui2)
        // 回溯状态信息
		col[i] = false
		dui1[row-i+n-1] = false
		dui2[i+row] = false
	}
	return sum
}

全部评论

相关推荐

合适才能收到offe...:项目岗是什么岗?我看你有段好像跟策划运营相关,如果找运营的话第三段经历写详细点儿。 个人建议是把自我评价删了换成专业技能放在工作经验上或者下面。学生会那个也可以删,把第一个包装成店铺运营,写4-6给点。第三个也是写4-6个点。注意工作内容➕部分数据。 投递的时候BOS招呼用语改一下,换成我有xx工作经验,熟练掌握xx技能样式,也可以简历截图然后直接发送。
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务