1. 程式人生 > >matlab_N皇后問題的解決

matlab_N皇后問題的解決

用matlab處理4/8/n皇后問題

問題提出與背景介紹

問題
1. 如果棋盤上有4個皇后,則使這4個皇后如何相安無事的方法有幾種。並打印出所有的情況。(其中用0表示該位置沒有皇后,用1表示該位置有皇后,棋盤為4*4結構)
2. 如果棋盤上有8個皇后呢?有幾種方法?(棋盤為8*8結構)
3. 如果棋盤上有n個皇后,又有幾種方法?(棋盤為n*n結構)(要求用鍵盤輸入一個數n(n<16),輸出方法的種數)

國際象棋中的皇后可以沿著水平線,垂直線,或者斜線前進,吃掉遇到的所有棋子。如果棋盤上的每個皇后都相安無事既不被其他皇后吃掉。

對於4皇后問題,可以用暴力窮舉,寫出所以的4*4的矩陣,然後判斷是否滿足皇后的規則,其中對角線的皇后的行列值相對應相減是相等,所以可以找出結果。

但是對於大於4的皇后問題來說?就不能用這樣的方法了,先從鍵盤輸出n的值,然後一行一行的分析,用到遞迴,然後遞迴結束的條件就是此時的行已經到了輸入的n的值了。

下面給出matlab程式碼,其中為兩個函式,一個主函式,一個遞迴函式。

function NQueensProblem
clc;
clear;

global C total n;

n = input('input the number of queens, n: ');
total = 0;
C = zeros (1,n);
search(1);
fprintf('%d solutions\n',total);

function
search(cur)
global n C total; if cur == n+1 %print result fprintf('No. %d: \n',total+1); for x=1:n for y=1:n if C(x)==y fprintf('1'); else fprintf('0'); end end fprintf('\n'); end total=total+1
; else for i=1:n ok=true; C(cur)=i; for j=1:(cur-1) if C(cur)==C(j)||(cur-C(cur))==(j-C(j))||(C(cur)+cur)==(C(j)+j) ok=false; break; end end if ok search(cur+1); end end end

相關推薦

matlab_N皇后問題的解決

用matlab處理4/8/n皇后問題 問題提出與背景介紹 問題 1. 如果棋盤上有4個皇后,則使這4個皇后如何相安無事的方法有幾種。並打印出所有的情況。(其中用0表示該位置沒有皇后,用1表示該位置有皇后,棋盤為4*4結構) 2. 如果棋盤上有8個皇后

遞歸回溯法解決皇后問題

一、八皇后問題 皇后是國際象棋中威力最大的棋子。她可以攻擊同一行、同一列以及與她處在斜線上的棋子。八皇后問題在1848年由國際西洋棋棋手馬克斯·貝瑟爾提出:如何在8x8格的棋盤上擺放八個皇后,使她們不能互相攻擊? 上圖是92種擺法中的其中一種。 一個有用的經驗是:在正式

第一次上傳程式碼 處女秀-回溯法解決皇后問題

c語言 # include<stdio.h> # include<math.h> # define max 8 int queen[max],sum=0; int check(int n){ int i; for(i=0;i<n;i+

回溯法解決N皇后問題

八皇后問題 在棋盤上放置8個皇后,使得它們互不攻擊,此時每個皇后的攻擊範圍為同行同列和同對角線,要求找出所有解。 遞迴函式將不再遞迴呼叫它自身,而是返回上一層呼叫,這種現象稱為回溯(backtracking)。 當把問題分成若干步驟並遞迴求解時,如果當前步驟沒有合法選擇,則函式將返回

回溯法解決N皇后問題(以四皇后為例)

回溯法解決N皇后問題(以四皇后為例) 其他的N皇后問題以此類推。所謂4皇后問題就是求解如何在4×4的棋盤上無衝突的擺放4個皇后棋子。在國際象棋中,皇后的移動方式為橫豎交叉的,因此在任意一個皇后所在位置的水平、豎直、以及45度斜線上都不能出現皇后的棋子,例子 要求程式設計求出符合要求的情

【資料結構與演算法】回溯法解決N皇后問題,java程式碼實現

N皇后問題 問題描述 在8×8格的國際象棋上擺放八個皇后,使其不能互相攻擊,即任意兩個皇后都不能處於同一行、同一列或同一斜線上,問有多少種擺法,這稱為八皇后問題。 延伸一下,便為N皇后問題。 核心思想 解決N皇后問題有兩個關鍵點。一是如何進行放置棋子,二是如何驗證棋子是否符合

Java遞迴解決n皇后問題

題目 八皇后問題是一個以國際象棋為背景的問題:如何能夠在 8×8 的國際象棋棋盤上放置八個皇后,使得任何一個皇后都無法直接吃掉其他的皇后?這道題目也可以稍微延伸一下,變為 N×N的棋盤上放置N個皇后,其他條件相同。 下面介紹一種比較簡單易懂的實現方式。 程式碼 impo

C語言解決皇后問題程式碼及解析

八皇后問題是一個古老而著名的問題。該問題是19世紀著名的數學家高斯1850年提出:在一個8*8國際象棋盤上,有8個皇后,每個皇后佔一格;要求皇后之間不會出現相互“攻擊”的現象,即不能有兩個皇后處在同一行、同一列或同一對角線上。問共有多少種不同的方法? 回溯演算法也叫試探法,它是一種搜尋問題的解的方法。冋溯演

小甲魚c語言版:八皇后問題解決思路

#include<stdio.h> int count=0; int notDanger(int row,int j,int (*chess)[8]){ int i,k,flag1=0,flag2=0,flag3=0,flag4=0,fla

一維陣列解決n皇后問題(暴力法)

     以5皇后為例遞迴實現:考慮每行只放置一個皇后、每列也只能放置一個皇后,那麼如果把n列皇后所在的行號依次寫出,那麼就會是1-n的一個排列。上圖a中的排列為24135,對於b來說就是35142。於是就只需要列舉1-n的所有排列,檢視每個排列對應的放置方案是否合法,統

10+行程式碼解決皇后問題

//C語言 遞迴+回溯 八皇后問題 //文末附10+行程式碼解決八皇后問題(全排列函式) /* chess[8][8]:國際象棋棋盤 (0表示不放皇后,1表示放皇后) row[8]:棋盤中每一行是否滿足要求(規定row[i]<=0為滿足要求) col[8]:棋盤中每一列是否滿足要求(規

位運算解決皇后問題

使用位運算來求解N皇后的高效演算法    核心程式碼如下: void test(int row, int ld, int rd)   {       int pos, p;       if ( row != upperlim )       {         

利用深度搜索法解決皇后問題

八皇后問題每行必須有一個皇后,所以,對棋盤深搜時,第一個皇后的位置不妨設為第一行,這樣只對第一行進行搜尋,同理,第二個皇后不妨設為第二行,以此類推。 下面附我的程式碼: #include<iostream> using namespace std; st

兩種不同方式解決皇后問題

問題描述 八皇后問題是一個以國際象棋為背景的問題:如何能夠在8×8的國際象棋棋盤上放置八個皇后,使得任何一個皇后都無法直接吃掉其他的皇后?為了達到此目的,任兩個皇后都不能處於同一條橫行、縱行或斜線上。 解決思路 這個問題可以有兩種解決方法,一種是使用遞

回溯法解決皇后(c++)

八皇后問題是一個以國際象棋為背景的問題:如何能夠在 8×8 的國際象棋棋盤上放置八個皇后,使得任何一個皇后都無法直接吃掉其他的皇后?為了達到此目的,任兩個皇后都不能處於同一條橫行、縱行或斜線上。八皇后問題可以推廣為更一般的n皇后擺放問題:這時棋盤的大小變為n1×n1,而皇后個數也變成n2。而且僅當

用回溯法解決皇后問題的思路,並求出17皇后解的數量(c#,c++,python表示)

1.解決思路借用網上一張圖,中間那個紅點表示的就是皇后,這圖的意思也就是一個皇后的影響範圍為這這個皇后所在的那一列,那一行,對角線以及次對角線。其它的皇后不能在它的影響範圍裡否則會衝突。八皇后也就是在一個8x8的棋盤上後置8個皇后,皇后的數量與棋盤的行列數一樣。這是基礎,再來

深度優先演算法解決“八皇后問題”

        “八皇后問題”的相關介紹,見 http://baike.baidu.com/view/698719.htm 。百度百科也給出了此問題的多種語言的求解。此處給出一個 C++ 語言的版本,可以求解“n 皇后問題”。求解方法為深度優先(Depth First Se

使用回溯法解決皇后問題(同樣適用於N皇后)。

在學習資料結構的時候,看到了一道八皇后的問題。寫完後,再去網上檢視發現原來這個問題有這麼多的優化解法,相比之下相形見絀。但我還是記錄下來,有興趣的小夥伴可以看看。 先大致說下我的思路 建立一個初始化值為0的8x8的陣列,0代表無皇后且不在其他

回溯法解決2n皇后(8皇后)問題

8皇后問題是演算法入門的經典,在8*8的國際象棋上擺放八個皇后,使其不能相互攻擊,即任意兩個皇后都不能處於同一 今天要說的2n皇后問題與傳統的8皇后問題有些不同,在一個n*n的棋盤中,有些位置不允許放皇后,現在要向棋盤中 放入n個黑皇后和n個白皇后,使任意的兩個黑白皇后

回溯法解決皇后問題(迴圈/遞迴)

# 回溯法解決八皇后問題 def place(l, k): for i in range(1,k): if l[i] == l[k] or abs(k-i) == abs(