基於numpy和回溯演算法的八皇后問題

2021-09-27 02:15:13 字數 1083 閱讀 3075

import numpy as np

class eightqueen():

def __init__(self,n): #n是棋盤的長寬,建構函式

self.n=n

self.arr=np.zeros((n,n)) #全0的二維陣列

def is_valid(self,i,j):

for k in range(0,self.n): #0~n,看看是否合法(能否放旗子)            

if self.arr[i][k]==1:

return false

if self.arr[k][j]==1:

return false

if (self.arr.diagonal(offset=j-i) == 1).any()==true: #對角線,i-j 偏移

return false

if (np.fliplr(self.arr).diagonal(offset=self.n-i-j-1).any()) ==true: #反對角線-fliplr,offset:偏移

return false                

return true

def putchess(self,x):#從第x行開始放旗子

if x>=self.n: #找到解了,退出迴圈。(如果x》n,則說明放滿了8個棋子,

self.output() #輸出結果

return

for i in range(0,self.n):#迴圈從0到n

if self.is_valid(x,i)==true:

self.arr[x][i]=1 #放上棋子

self.putchess(x+1) #開始下一行嘗試

self.arr[x][i]=0 #回溯,取回棋子

def output(self):

print(self.arr) #輸出結果

print('----------------')

pass

q=eightqueen(8)

q.putchess(0)

q=eightqueen(4)

q.putchess(0)

C語言基於回溯演算法解決八皇后問題的方法

問題描述 八皇后問題,是乙個古老而著名的問題,是回溯演算法的典型案例 在8x8格的西洋棋棋盤上擺放八個皇后,使其不能互相攻擊,即任意兩個皇后都不能處於同一行 同一列或同一斜線上,問有多少種擺法。問題求解 採用回溯演算法,即從第一行開始,依次探查可以放置皇后的位置,若找到,則放置皇后,開始探查下一行 ...

八皇后問題的回溯演算法

八皇后問題是乙個古老而著名的問題,是回溯演算法的典型例題。該問題是十九世紀著名的數學家高斯1850年提出 在8x8格的西洋棋上擺放八個皇后,使其不能互相攻擊,即任意兩個皇后都不能處於同一行 同一列或同一斜線上,問有多少種擺法。include define maxn 20 int u maxn l 2...

八皇后的演算法實現(回溯法)

前言 1 問題重述 在8x8格的 西洋棋上擺放八個皇后,使其不能互相攻擊,即任意兩個皇后都不能處於同一行 同一列或同一斜線上,問有多少種擺法?2 實現 看不懂在說,應該看得懂啊!都有注釋的說 首先是給出的main程式的入口 八皇后.cpp 定義控制台應用程式的入口點。include stdafx.h...