# 2n queens
def solve(row):# 传入一个行数就够了,map_lst 是可变数组,可以直接修改之,# 计数的ans设置为全局变量,列数每一次都要从0访问到n-1global ansif row == 2 * n:ans += 1return 0 # return几无所谓,我们只是想要计数,计完数停止if row < n: # 如果放黑棋put_in = 2else:put_in = 3real_row = row % n # 下面用real_row来进行访问for tmp_col in range(0, n): # 当前行,所有列都要考虑if is_place(row, tmp_col): # 如果可以放,就放map_lst[real_row][tmp_col] = put_insolve(row + 1) # 放完,进行递归,考虑下一行map_lst[real_row][tmp_col] = 1 # 上一层递归要么摆放成功,ans加 1;要么不成功,不用操作,直接return停止。不管是那种情况# 我们都要回溯,继续考虑这一行中的下一个return 0 # 结束def is_place(row, col): # row表示行,col表示列if row < n: # 模为n,即如果放了前面0-n-1行(黑棋放好),row%n得0,从第0行开始放白棋judge_sign = 2 # 如果在放黑棋,而黑棋用2表示,所以接下来的判断标志设为2else:judge_sign = 3 # 否则为白棋# 白皇后黑皇后统称为棋子# 四种情况,1、当前位置能否放、有无别的棋子 2、当前列有无冲突 3、左上对角线 4、右上对角线row = row % nif map_lst[row][col] != 1: # 可能等于0,也可能放了另一个颜色的棋子return Falsefor tmp_row in range(row - 1, -1, -1): # 判断列if map_lst[tmp_row][col] == judge_sign:return Falsetmp_row = row - 1tmp_col = col - 1while tmp_row >= 0 and tmp_col >= 0: # 判断左上对角线if map_lst[tmp_row][tmp_col] == judge_sign:return Falsetmp_row -= 1tmp_col -= 1tmp_row = row - 1tmp_col = col + 1while tmp_row >= 0 and tmp_col <= n - 1: # 判断右上对角线if map_lst[tmp_row][tmp_col] == judge_sign:return Falsetmp_row -= 1tmp_col += 1return Trueif __name__ == "__main__":n = int(input()) # 输入的规格map_lst = [] # 地图for i in range(n):one_line = [int(j) for j in input().split()]map_lst.append(one_line)ans = 0 # 计数的答案solve(0)print(ans)