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 }