|
发表于 2017-8-16 15:23:05
|
显示全部楼层
哇,人比较笨 ,写了好久。主要难点在斜线检测和递归调用。答案:1225个 代码如下 result[]中存放了所有结果:- import copy
- #直线的检查方法:
- def row_check(coor,i,j,n): #行检测
- for each in range(n):
- if coor[i][each]==1:
- return 0
- else:
- return 1
- def column_check(coor,i,j,n): #列检测
- for each in range(n):
- if coor[each][j]==1:
- return 0
- else:
- return 1
- def slash_check(coor,i,j,n): #斜线检测
- if i>j:
- for delta in range(n-i+j):
- if coor[i-j+delta][delta]==1:
- return 0
- elif i==j:
-
- for delta in range(n):
- if coor[delta][delta]==1:
- return 0
- if 2*i-n+1>=0:
- for delta in range(2*n-2*i-1):
- if coor[n-delta-1][2*i-n+1+delta]==1:
- return 0
- else:
- for delta in range(2*i+1):
- if coor[2*i-delta][delta]==1:
- return 0
- else:
- for delta in range(n-j+i):
- if coor[delta][j-i+delta]==1:
- return 0
- if i+j>=n-1:
-
- for delta in range(2*n-i-j-2+1):
- if coor[n-1-delta][i+j+1-n+delta]==1:
- return 0
- else:
-
- for delta in range(i+j+1):
- if coor[i+j-delta][delta]==1:
- return 0
- return 1
- def check(coor,i,j,n): #检测是否可以放置皇后 可以返回1 否则返回0
- a=row_check(coor,i,j,n)
- b=column_check(coor,i,j,n)
- c=slash_check(coor,i,j,n)
- if a and b and c:
- return 1
- else:
- return 0
- def backtracking(coor,i,n):
- if i==n-1:
-
- for j in range(n):
- if check(coor,i,j,n):
- coor[i][j]=1
- global result
- result.append(copy.deepcopy(coor))
- coor[i][j]=0
- return result
-
- for j in range(n):
-
- if check(coor,i,j,n):
- coor[i][j]=1
- i+=1
- backtracking(coor,i,n)
- i-=1
- coor[i][j]=0
- return result
- def queen(n):
- checkerboard=[[0 for i in range(n)]for i in range(n)]
- return backtracking(checkerboard,0,n)
-
- result=[]
- for n in range(1,11):
- queen(n)
- print(len(result))
复制代码 |
评分
-
查看全部评分
|