banner
李大仁博客

李大仁博客

天地虽大,但有一念向善,心存良知,虽凡夫俗子,皆可为圣贤。

[算法]經典算法8皇后(N皇后)問題的解法,C語言實現

今天寫點簡單的,C 語言求解八皇后問題,相信學過 C 語言的朋友一定知道這個經典問題吧,解法也是多種,目前主要有回溯,遞推兩種方法,今天講回溯 + 遞歸的求法,效率可能不太高,不過直接易於理解

問題:能不能在一個標準的國際象棋棋盤上放 8 個皇后,使她們相互之間不能互吃具體點就是,在一個 8*8 的棋盤上放皇后,皇后是所有方向上都可以移動的,現在要讓她們不能互吃的話就要使得她們不會在同一條線上

具體解法:從第一行第一列的位置開始放棋子(假定列優先),然後記錄其佔用的行斜直線的編號,然後放第二個棋子,在排除前面所有棋子的所佔的編號的情況下選擇到有效位置,然後繼續,直到放滿 8 個棋子為止

代碼如下:

/*
* 八皇后算法問題
*author CG
*2008 12 22
*/
#include "stdio.h"
#include "stdlib.h"
#include "conio.h"
#define N 8 /* 設置皇后數量為 8*/

int a [N], b [2*N + 1], c [2*N +1];/* 三個數組記錄各個方向上的皇后 */
int count = 0;/* 計數器 */

int Queen(int row) {
int col; /* 局部變量 */
for (col = 1 ; col < = N ; col++){
if (a[col - 1] + b[row + col - 2] + c[row - col + N - 1] == 0) {
/*
* 這裡這部很重要,用於判斷皇后位置是否符合條件,只有各個方向的直線上
* 都沒有皇后才符合條件
* a [col-1] 記錄第 col 列有無皇后,1 表示有。
* b [row+col-2] 記錄從左上數第 row+col-1 條斜率為 1 的線上有無皇后。
* c [row-col+N-1] 記錄從右上數第 row-col+N-1 條斜率為 -1 的線上有無皇后。
*/
a [col - 1] = 1; /* 更改數據 */
b[row + col - 2] = 1;
c[row - col + N - 1] = 1;

	gotoxy(col \* 2 , row);/\* 畫皇后 \*/
	putch('Q');

	if (row < N){/\*如果沒有遍歷所有row\*/
		Queen(row + 1); /\*繼續\*/
	}
	else {/\*遞歸結束\*/
		count++; /\*計數器+1\*/
		gotoxy(1 , N + 2);
		printf("Solution No %d ", count);
		getch();
	}
a\[col - 1\] = 0; /\* 清空數據 \*/
b\[row + col - 2\] = 0;
c\[row - col + N-1\] = 0;
gotoxy(col \* 2 , row); /\* 清除圖像 \*/
putch('.');
}/\*if \*/

}/*for */
return 0;
}/*Queen */

int main()
{
int i, j;
clrscr ();/* 清屏 */
for (i = 1 ; i <= N ; i++){/* 畫棋盤 */
for(j = 1 ; j <= N ; j++){
gotoxy (i * 2 , j);/* 注意字符佔位問題大寫 Q 和點號佔兩個字符位 */
putch('.');
}/*for*/
}/*for*/
Queen (1); /* 開始回溯算法 */
gotoxy (1 , N + 3); /* 顯示最後結果 */
printf("%d Solution(s)n", count);
system("pause");
}/*main*/

載入中......
此文章數據所有權由區塊鏈加密技術和智能合約保障僅歸創作者所有。