程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> 關於C語言 >> 數據結構八皇後問題 實現代碼

數據結構八皇後問題 實現代碼

編輯:關於C語言
 

八皇後問題,是一個古老而著名的問題,是回溯算法的典型例題。該問題是十九世紀著名的數學家高斯1850年提出:在8X8格的國際象棋上擺放八個皇後,使其不能互相攻擊,即任意兩個皇後都不能處於同一行、同一列或同一斜線上,問有多少種擺法。 高斯認為有76種方案。1854年在柏林的象棋雜志上不同的作者發表了40種不同的解,後來有人用圖論的方法解出92種結果。計算機發明後,有多種方法可以解決此問題。

維基百科中的解釋:

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

基本要求就是這樣:同行,同列,同對角線不能有棋子就OK了. 我的數據結構課本上給的提示是用遞歸的方法做.所以我就把我的代碼寫一下.順便做下注釋.如果大家有更好的解法,可以給我說哦. 我發現我的代碼量有點多,由於我不太懂那些用一維數組的方法,所以我的方法顯得有點笨,但是好歹可以做出來.
#include<stdio.h>
int queen[8][8]; //定義一個二維數組,存放棋盤
int m=1; //定義解法個數
int check(int i,int j)
//檢查函數,結果用k返回,如果k=0,則所有的檢查位置都符合條件,可以放棋子
{ int k=0;int a,b;
for(a=0;a<i;a++)//檢查同列是否有棋子
if(queen[a][j]==1)
k++;
for(a=i-1,b=j-1;a>=0&&b>=0;a--,b--)//檢查左對角線元素
if(queen[a][b]==1)
k++;
for(a=i-1,b=j+1;a>=0&&b<8;a--,b++)//檢查右對角線元素
if(queen[a][b]==1)
k++;
return k;
}
void put(int i) //遞歸函數,放棋子
{ int j;
if(i>=8) //當i大於等於8時,輸出已經放好的棋子,i從0開始
{
printf("第%d種解法:\n",m++);
for(i=0;i<8;i++)
{
for(j=0;j<8;j++)
if (queen[i][j]==1 )
printf("%d ",j);
else printf("- ");
printf("\n");
}
printf("\n");

}
else //遞歸放棋子
for(j=0;j<8;j++)
{ queen[i][j]=1;
if(check(i,j)==0)
put(i+1);
queen[i][j]=0;
}
}
int main() //主函數
{put(0);
return 0;
} 輸出格式為: "第X種解法: 棋盤布局;"

 

 
  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved