八皇后問題是乙個經典的問題,其核心是:在n*n的棋盤上,有n個皇后,這些皇后必須位於不同行不同列上,並且不能處於同一對角線上,否則會因相互攻擊而死亡。那麼如何安排皇后們的位置呢?
我們可以利用回溯法,先確定第乙個皇后的位置,之後進入下一行,確定第二個皇后的位置,再之後進入下一行,如果發現找不到乙個位置安排新皇后,則回退到上一行,將上一行的皇后向後移動一列,再考慮下一行的皇后,如此迴圈,直到安排好所有的皇后為止。附上一張以便於理解。
具體實現的**及所遇到的問題及解決如下:
2016/4/15更新:#include
#include
#include
#define ok 1
#define error 0
#define true 1
#define false 0
typedef
int status;
/*列印答案*/
status printsolution(int *x,int n)
printf("\n");
}printf("\n");
}status isplace(int *x,int k)
return ok;
}status nqueen(int *x,int n)
}else
//x[k]如果大於n,則不必考慮此行,k--回溯到上一行
k--;
}}int main(void)
今天覆習了八皇后問題,在此過程中發現了不少之前忽視的問題,下面加以總結以便回顧反思。
問題主要出現在status nqueen()函式中
status nqueen(int *x,int n)
}else
i--;}}
關於八皇后問題的研究 回溯演算法
今天從早上開始就在弄回溯法,都說回溯的經典問題是八皇后問題,於是就好好看了一下八皇后的問題。找出所有的情況可能有點難,但是找出一條路來感覺應該挺簡單的。我一直都不怎麼會用遞迴,這個程式依然沒有遞迴。這個演算法主要解決八皇后問題 public class huisu02 xx yy 判斷反對角線 xx...
關於八皇后問題的研究 回溯演算法
今天從早上開始就在弄回溯法,都說回溯的經典問題是八皇后問題,於是就好好看了一下八皇后的問題。找出所有的情況可能有點難,但是找出一條路來感覺應該挺簡單的。我一直都不怎麼會用遞迴,這個程式依然沒有遞迴。這個演算法主要解決八皇后問題 public class huisu02 xx yy 判斷反對角線 xx...
八皇后問題用棧與回溯法實現
程式的演算法和思想 偽 1 建立乙個棧stack和乙個陣列int 8 8 相當於乙個8 8的棋盤 2 把第一行的八個皇后都入棧然後輸出最後乙個皇后 3 while stack.isempty 最上面的乙個皇后pop出棧,再把皇后這行和下面的行數都清為零 4 然後標記皇后為1,如果這是最後一行就輸出這...