8 황후 문제 파 이 썬 버 전
N * N 정사각형 바둑판 을 정 하고 그 위 에 N 개의 바둑 알 을 놓 으 면 황후 라 고도 부 르 며 두 개의 바둑 알 이 모두 같은 횡선, 세로 선, 사선 에 있 지 않도록 한다.일반적으로 우 리 는 8 황 후 를 토론 하지만 N > 4 만 있 으 면 해 가 존재 할 것 이다.
분석:
방법 1: 정의 에 따라 처리 합 니 다. 즉, 바둑판 에 황 후 를 놓 을 때마다 어떤 위치 에 새로 가입 한 황 후 를 놓 을 수 있 는 지, 어떤 곳 에 황 후 를 놓 으 면 충돌 할 수 있 는 지 판단 해 야 합 니 다.내 가 아래 에 쓴 이 코드 는 바로 이것 에 기초 한 것 이다.
방법 2. 저 는 다른 사람의 최 적 화 를 보 았 습 니 다. 주로 비트 연산 으로 계산 복잡 도 를 낮 추 는 것 을 실 현 했 습 니 다. 저 는 Python 으로 이 를 실현 하지 않 았 습 니 다.
그래서 여기 구 덩이 를 하나 파 요.
코드:
코드 에 있 는 주석 은 상세 한 설명 이 있 습 니 다. N 값 을 설정 하면 요구 에 부 합 된 해 를 되 돌려 줍 니 다.그러나 이 문 제 는 또 하나의 진급 이 있다. 그것 은 바로 몇 개의 해 가 있 는 지 토론 하 는 것 이다. 그러면 수론 의 지식 이 필요 하 다. 그리고 나 는 이 수학 에 대해 연구 한 적 이 없 기 때문에 코드 도 실현 되 지 않 았 다.여러분, 코드 를 아 쉬 운 대로 사용 하 시 면 됩 니 다.
class EightQueensPuzzle(object):
'''
:
eight_q = EightQueensPuzzle(4, 5)
print "EIGHT QUEEDS PUZZLE:"
result = eight_q.eight_queens_puzzle()
for i in result:
print i
'''
def __init__(self, n, char):
self.n = n #
self.char = char #
def init_chess_board(self, n):
'''
, n , , 8
:return: , 8*8
'''
chess_board = []
for i in xrange(0, n):
line = []
for j in xrange(0, n):
line.append(0)
chess_board.append(line)
return chess_board
def update_conflict_board(self, conflict_board, position):
for k in xrange(0, self.n): # 1
conflict_board[position[0]][k] = 1
for id in xrange(position[0]+1, self.n):
conflict_board[id][position[1]] = 1 # 1
if position[0] + position[1] - id >= 0: # 1
conflict_board[id][position[0] + position[1] - id] = 1
if position[1] - position[0] + id < self.n: # 1
conflict_board[id][position[1] - position[0] + id] = 1
def queens_conflict(self, conflict_board, position):
'''
conflict_board, position , 。
False, True
'''
if conflict_board[position[0]][position[1]] != 0:
return False
else:
return True
def eight_queens_puzzle(self):
'''
。
:return: .
'''
import random
while True: #
chess_board = self.init_chess_board(self.n)
conflict_board = self.init_chess_board(self.n)
for i in xrange(0, self.n):
flag = 0
for cnt in conflict_board[i]:
if cnt != 0:
flag += 1
if flag == self.n: # 1 ,
break
while True:
pos = [i, random.randint(0, self.n-1)] #
if self.queens_conflict(conflict_board, pos): #
chess_board[i][pos[1]] = self.char
self.update_conflict_board(conflict_board, pos)
break
if self.char in chess_board[self.n-1]:
return chess_board
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
Python의 None과 NULL의 차이점 상세 정보그래서 대상 = 속성 + 방법 (사실 방법도 하나의 속성, 데이터 속성과 구별되는 호출 가능한 속성 같은 속성과 방법을 가진 대상을 클래스, 즉 Classl로 분류할 수 있다.클래스는 하나의 청사진과 같아서 하나의 ...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.