八皇后問題絕對是乙個經典的演算法題,自己寫了一遍,有點感悟,就寫了下來:
這是我所寫的**,好不好不知道,但確實這個問題解決了:
1 #include 2static
int sum=0;//
用於計算排列方式的個數
3int nodanger(int row,int col,int(*p)[8])9
for(j=0;j<8;j++)
13if(((i-row)==(j-col)||(i-row)==(col-j))&&(*(p[i]+j))==1
) 14
//判斷對角線上是否存在皇后
151819}
2021}22
return1;
23}24//
列印排列
25void print_chess(int(*p)[8
])31 printf("\n"
);32}33
34}3536
37int tryput(int row,int(*p)[8
])44}45
for(j=0;j<8;j++)
54 tryput(row+1
,fatechess);
55 fatechess[row][j]=0;56
if(j<7)59
6061 }else
6566}67
}6869int initchess(int(*p)[8
])77}78
return0;
79}8081
int main(void
)90
其實:該演算法只要想通以下幾點:
1,這個位置能不能放 由函式nodanger()判斷;
2,能放的話那就把它拷貝乙份用於實念,並把這個地方設成皇后,然後在進行下行位置的檢測,與嘗試,
如果嘗試成功,就繼續嘗試,否則的話就將所設的最後乙個皇后抹除,並進行下個位置嘗試;
如果不能放的話,那就繼續迴圈檢測下乙個(continue);
3,什麼時候停:對於遞迴函式tryput()的引數row記載的是已經放了皇后的行數,即皇后的個數-1
當row=7時即可停下,並列印!
只要想通的這個過程,就可舉一反三,多少皇后也不是問題了,呵呵!
八皇后問題
八皇后問題 ackarlix 八皇后問題是乙個古老而著名的問題,是回溯演算法的典型例題。該問題是十九世紀著名的數學家高斯 1850 年提出 在 8x8格的西洋棋上擺放八個皇后,使其不能互相攻擊,即任意兩個皇后都不能處於同一行 同一列或同一斜線上,問有多少種擺法。高斯認為有 76種方案。1854 年在...
八皇后問題
include iostream.h int a 8 8 棋盤 int r 8 結果 int i,j int count 0 void init i j 0 int judge int x,int y for int mi x 1,mj y mi 1 mi for int ri x 1,rj y 1...
八皇后問題
package quess 由於八個皇后的任意兩個不能處在同一行,那麼這肯定是每乙個皇后佔據一行。於是我們可以定義乙個陣列columnindex 8 陣列中第i個數字表示位於第i行的皇后的列號。先把columnindex的八個數字分別用0 7初始化,接下來我們要做的事情就是對陣列columninde...