回溯問題 八皇后

2021-07-29 17:15:39 字數 834 閱讀 6747

在國際下象棋中,皇后可以在橫、豎、斜線上不限步數吃掉其他棋子,故需要考慮怎麼將8個皇后放在棋盤上(棋盤為8x8)。此為八皇后問題,為經典回溯演算法問題,以下輸出結果將輸出『*』為為方棋子的空位,『@』為放置的皇后位置:

static char queen[8][8];

static int a[8]; //a陣列代表列衝突

static int b[15]; //b陣列代表主對角線衝突

static int c[15]; //c陣列代表從對角線衝突

static int iqueennum = 0; //記錄總的棋盤狀態數

void cal(int i); //i代表行數

int main()

//主、從對角線標記初始化為0,表示沒有衝突

for(iline=0;iline<15;iline++)

b[iline]=c[iline]=0;

cal(0);

return 0;

} void cal(int i)

printf("\n\n");

}//如果前次的皇后導致後面放置無論如何都不能滿足要求,則回溯,重置

queen[i][icolumn] = '*';

a[icolumn] = 0;

b[i-icolumn+7] = 0;

c[icolumn+i] = 0;

} }}

輸出結果為:

共92種解法,即92種不同排放方法。

回溯 八皇后問題

八皇后問題 國際西洋棋棋手馬克斯 貝瑟爾於1848年提出 在8 8格的西洋棋上擺放八個皇后,使其不能互相攻擊,即任意兩個皇后都不能處於同一行 同一列或同一斜線上,問有多少種擺法。分析 八皇后問題是回溯演算法的典型案例。我想我們在自己做的過程中,是這樣的 是先從 0,0 這個座標開始排放皇后,然後 1...

八皇后問題 回溯

在劉汝佳老師的書中對於8皇后問題的分析 我感覺非常經典 8皇后問題可行的解 92個 一共有3種思考的出發點 從64個格仔中選乙個子集,使得 子集中恰好有8個格仔,且任意兩個選出的格仔都不在同一行,同一列或同一對角線上 這正是子集的列舉問題。然而,64個格仔的子集有264個,太大了,這並不是乙個很好的...

八皇后問題(回溯)

八皇后問題是乙個以西洋棋為背景的問題 如何能夠在 8 8 的西洋棋棋盤上放置八個皇后,使得任何乙個皇后都無法直接吃掉其他的皇后?為了達到此目的,任兩個皇后都不能處於同一條橫行 縱行或斜線上。可設定乙個陣列a i j,代表第i行第j列放置棋子。先按行從上往下的順序,每遞迴一次,在每一行的某一列放乙個棋...