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
}