解题思路:n皇后详解
n=int(input()) table=[] for _ in range(n): table.append(list(map(int,input().split()))) def black_check(x,y): #检查当前是否可以放棋子 if table[x][y]==0: return False #检查竖直有没有黑棋子 for i in range(x): if table[i][y]=='b': return False #检查主对角线有没有黑棋子 i,j=x-1,y-1 while i>=0 and j>=0: if table[i][j]=='b': return False i,j=i-1,j-1 #检查副对角线有没有黑棋子 i,j=x-1,y+1 while i>=0 and j<n: if table[i][j]=='b': return False i,j=i-1,j+1 return True def white_check(x,y): #检查当前是否可以放棋子,这里放了黑棋子的和是0的都不能放了 if table[x][y]=='b'or table[x][y]==0: return False #检查竖直有没有白棋子 for i in range(x): if table[i][y]=='w': return False #检查主对角线有没有白棋子 i,j=x-1,y-1 while i>=0 and j>=0: if table[i][j]=='w': return False i,j=i-1,j-1 #检查副对角线有没有白棋子 i,j=x-1,y+1 while i>=0 and j<n: if table[i][j]=='w': return False i,j=i-1,j+1 return True cnt=0 def b_dfs(b_x): #print('我进来了b_dfs') global cnt global table if b_x==n: # print('黑' ,table) # 黑棋子放好了放白棋子 w_dfs(0) return for y in range(n): if black_check(b_x,y): table[b_x][y]='b' b_dfs(b_x+1) table[b_x][y]=1 return def w_dfs(w_x): global cnt global table #print('我进来了w_dfs') if w_x==n: #白棋子放完了,数量加1 cnt+=1 #print('白',table) return for y in range(n): if white_check(w_x,y): table[w_x][y]='w' w_dfs(w_x+1) table[w_x][y]=1 return b_dfs(0) print(cnt)
0.0分
8 人评分
开心的金明 (C++代码)浏览:1188 |
C语言程序设计教程(第三版)课后习题9.10 (C语言代码)浏览:605 |
母牛的故事 (C语言代码)浏览:1300 |
2006年春浙江省计算机等级考试二级C 编程题(2) (C语言代码)浏览:468 |
C语言程序设计教程(第三版)课后习题10.5 (C语言代码)浏览:552 |
C语言程序设计教程(第三版)课后习题6.3 (C语言代码)浏览:660 |
C语言程序设计教程(第三版)课后习题1.5 (C语言代码)浏览:474 |
C语言程序设计教程(第三版)课后习题9.6 (C语言代码)浏览:373 |
图形输出 (C语言代码)浏览:1387 |
字符串的输入输出处理 (C语言代码)浏览:1016 |