八皇后问题,经典的回朔算法

const N int = 8 //八皇后问题

var Board [N][N]int = [N][N]int{} //初始化棋盘
var Result int = 0

func setBlock(row int, col int, val int) { //设置障碍,-1
	//设置不可放置宫格
	for r, c := row, col; r < N && c >= 0; {
		//设置左下宫格
		Board[r][c] += val
		c--
		r++
	}
	for r := row; r < N; r++ {
		//设置正下方宫格
		Board[r][col] += val
	}
	for r, c := row, col; r < N && c < N; {
		//设置右下方宫格
		Board[r][c] += val
		c++
		r++
	}
}

func recursive(row int, col int) { //递归
	if row == N { // row 行号
		Result++
		return
	}
	for ; col < N; col++ {
		if Board[row][col] == 0 {
			//设置不可访问宫格
			setBlock(row, col, -1) //置成-1
			recursive(row+1, 0)    //从第 0 列开始
			//还原上一次设置
			setBlock(row, col, 1) //回朔的时候再重新置成 0
		}
	}
}

func main() {
	recursive(0, 0)
	fmt.Println(Result)
}
posted @ 2021-08-23 23:57  沧海一声笑rush  阅读(63)  评论(0编辑  收藏  举报