本文實(shí)例講述了C語言基于回溯算法解決八皇后問題的方法。分享給大家供大家參考,具體如下:

問題描述:
八皇后問題,是一個古老而著名的問題,是回溯算法的典型案例:在8X8格的國際象棋棋盤上擺放八個皇后,使其不能互相攻擊,即任意兩個皇后都不能處于同一行、同一列或同一斜線上,問有多少種擺法。
問題求解:
采用回溯算法,即從第一行開始,依次探查可以放置皇后的位置,若找到,則放置皇后,開始探查下一行;若該行沒有位置可以放置皇后,則回溯至上一行,清除該行放置皇后的信息,從該行原本放置皇后的下一個位置開始探查可以放置皇后的位置。求所有解時,每找到一組解,就清除這一組解最后一個皇后的位置信息,開始探查該行另外一個可以放置皇后的位置,依次回溯求解。
存儲結(jié)構(gòu):
一維數(shù)組:col[8]:存放第i列有無皇后的標(biāo)記信息
一維數(shù)組:left[15]:存放每一條左斜線上的有無皇后的標(biāo)記信息
一維數(shù)組:right[15]:存放每一條右直線上有無皇后的標(biāo)記信息
一維數(shù)組:Q[8]:存放第i行的皇后的列下標(biāo)
代碼實(shí)現(xiàn):
#include<stdio.h>
#define N 8
int col[N] = { 0 };
int right[2 * N - 1] = { 0 };
int left[2 * N - 1] = { 0 };
int Q[N];
int cnt = 0;
void Print()
{
int i;
for (i = 0; i < N; i++)
{
for (int j = 0; j < N; j++)
{
if (Q[i] == j)
printf("■");
else
printf("□");
}
printf("\n");
}
printf("==========================\n");
cnt++;
}
void Queen(int i)
{
int j;
for (j = 0; j < N; j++)
{
if ((!col[j]) && (!left[i + j]) && (!right[7 + i - j]))
{
Q[i] = j;//放皇后
col[j] = 1;
left[i + j] = 1;
right[N - 1 + i - j] = 1;//已有皇后的標(biāo)記
if (i < N - 1)
{
Queen(i + 1);
}
else
{
Print();
}
col[j] = 0;
right[N - 1 + i - j] = 0;
left[i + j] = 0;//清除標(biāo)記,查找下一組解
}
}
}
int main(void)
{
Queen(0);
printf("%d", cnt);
getchar();
return 0;
}
另外有需要云服務(wù)器可以了解下創(chuàng)新互聯(lián)建站www.chinadenli.net,海內(nèi)外云服務(wù)器15元起步,三天無理由+7*72小時售后在線,公司持有idc許可證,提供“云服務(wù)器、裸金屬服務(wù)器、高防服務(wù)器、香港服務(wù)器、美國服務(wù)器、虛擬主機(jī)、免備案服務(wù)器”等云主機(jī)租用服務(wù)以及企業(yè)上云的綜合解決方案,具有“安全穩(wěn)定、簡單易用、服務(wù)可用性高、性價比高”等特點(diǎn)與優(yōu)勢,專為企業(yè)上云打造定制,能夠滿足用戶豐富、多元化的應(yīng)用場景需求。
網(wǎng)站題目:C語言基于回溯算法解決八皇后問題的方法-創(chuàng)新互聯(lián)
文章鏈接:http://www.chinadenli.net/article36/dcchsg.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供網(wǎng)站設(shè)計、網(wǎng)站制作、定制開發(fā)、外貿(mào)網(wǎng)站建設(shè)、企業(yè)網(wǎng)站制作、網(wǎng)站收錄
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時需注明來源: 創(chuàng)新互聯(lián)
猜你還喜歡下面的內(nèi)容