程式設計師面試例題

來源:果殼範文吧 1.9W

面試例題:八皇后問題是一個古老而著名的問題,是回溯演算法的'典型例題。該問題是 19 世紀著名的數學家高斯 1850 年提出:在 8×8 格的國際象棋盤上擺放 8 個皇后,使其不能互相攻擊,即任意兩個皇后都不能處於同一行、同一列或同一斜線上,問有多少種擺法。[英國某著名計算機圖形影象公司面試題]

程式設計師面試例題

解析:遞迴實現 n 皇后問題。

演算法分析:

陣列 a、b、c 分別用來標記衝突,a 陣列代表列衝突,從 a[0]~a[7]代表第 0 列到第 7 列。如果某列上已經有皇后,則為 1,否則為 0。

陣列 b 代表主對角線衝突,為 b[i-j+7],即從 b[0]~b[14]。如果某條主對角線上已經有皇后,則為 1,否則為 0。

陣列 c 代表從對角線衝突,為 c[i+j],即從 c[0]~c[14]。如果某條從對角線上已經有皇后,則為 1,否則為 0。

程式碼如下:

#include

static char Queen[8][8];

static int a[8];

static int b[15];

static int c[15];

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

void qu(int i);

//引數i 代表行

int main()

{

int iLine,iColumn;

//棋盤初始化,空格為*,放置皇后的地方為@

for(iLine=0;iLine<8;iLine++)

{

a[iLine]=0; //列標記初始化,表示無列衝突

for(iColumn=0;iColumn<8;iColumn++)

Queen[iLine][iColumn]='*';

}

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

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

b[iLine]=c[iLine]=0;

qu(0);

return 0;

}

void qu(int i)

{

int iColumn;

for(iColumn=0;iColumn<8;iColumn++)

{

if(a[iColumn]==0&&b[i-iColumn+7]==0&&c[i+iColumn]==0)

//如果無衝突

{

Queen[i][iColumn]='@';

//放皇后

a[iColumn]=1;

//標記,下一次該列上不能放皇后

b[i-iColumn+7]=1;

//標記,下一次該主對角線上不能放皇后

c[i+iColumn]=1;

//標記,下一次該從對角線上不能放皇后

if(i<7) qu(i+1);

//如果行還沒有遍歷完,進入下一行

else //否則輸出

{

//輸出棋盤狀態

int iLine,iColumn;

printf("第%d 種狀態為: ",++iQueenNum);

for(iLine=0;iLine<8;iLine++)

{

for(iColumn=0;iColumn<8;iColumn++)

printf("%c ",Queen[iLine][iColumn]);

printf(" ");

}

printf(" ");

}

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

Queen[i][iColumn]='*';

a[iColumn]=0;

b[i-iColumn+7]=0;

c[i+iColumn]=0;

}

}

}

熱門標籤