打靶 遞迴演算法 八皇后 回溯演算法

2021-09-05 16:41:15 字數 2787 閱讀 4408

面試例題1乙個射擊運動員打靶,靶一共有10環,連開10槍打中90環的可能性有多少種?請用遞迴演算法程式設計實現。[中國某著名通訊企業h面試題]

解析:靶上一共有10種可能——1環到10環,還有可能脫靶,那就是0環,加在一起共11種可能。這是一道考迴圈和遞迴的面試題。我們在這個程式中將利用遞迴的辦法實現打靶所有可能的演示,並計算出結果。讀者會問,難道一定要使用遞迴?當然不是。我們也可以連續用10個迴圈語句來表示程式,**如下:

for (i1=0;i1<=10;i1++)

......

} }

}但是,上面的迴圈程式雖然解決了問題,但時間複雜度和空間複雜度無疑是很高的。比較好的辦法當然是採用遞迴的方式,事實上公司也就是這麼設計的。遞迴的條件由以下4步完成:

(1)如果出現這種情況,即便後面每槍都打10環也無法打夠總環數90,在這種情況下就不用再打了,則退出遞迴。**如下:

if(score < 0 || score > (num+1)*10 ) //次數num為0~9

(2)如果滿足條件且打到最後一次(因為必須打10次),**如下:

if(num == 0) 

(3)如果沒有出現以上兩種情況則執行遞迴,**如下:

for(int i = 0; i <= 10; ++i)

(4)列印函式,符合要求的則把它列印出來。**如下:

public static void output(int store2)

",store2[i]);

}console.writeline();

sum++;

}答案:

用c#編寫的完整**如下:

using system ;

public class m

;

} //列印函式

//符合要求的則把它列印出來

public static void output(int store2)

",store2[i]);

}console.writeline();

sum++;

} //計算總數,返回sum值

public static int sum2()

public static void cumput(int score, int num, int store2 )

//如果滿足條件且達到最後一層

if(num == 0) 

for(int i = 0; i <= 10; ++i)

"   ",store2[5]); }

} ",store[3]);

//cout<<"總數:"<

console.write(" 總數:   ",sum);

}}  

程式結果一共有92 378種可能。

也可以用c++編寫,**如下:

#include

using namespace std;

int sum;

int store[10];

void output()

cout<

++sum; }

void cumput(int score, int num)

for(int i = 0; i <= 10; ++i)

} int main(int argc, char* argv)

面試例題2八皇后問題是乙個古老而著名的問題,是回溯演算法的典型例題。該問題是19世紀著名的數學家高斯2023年提出:在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()

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

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

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

qu(0);

return 0; }

void qu(int i)

printf("\n\n"); }

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

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

a[icolumn]=0;

b[i-icolumn+7]=0;

c[i+icolumn]=0; }

} }

回溯遞迴演算法 八皇后問題

前,有皇帝。就拿八皇后。由此產生的一系列問題,凌亂。由此產生的八皇后問題。哈哈 開玩笑 八皇后問題,是乙個古老而著名的問題,是回溯演算法的典型案例。該問題是國際西洋棋棋手馬克斯 貝瑟爾於1848年提出 在8x8格的西洋棋上擺放八個皇后,使其不能互相攻擊,即隨意兩個皇后都不能處於同一行 同一列或同一斜...

遞迴 八皇后問題(回溯演算法)

問題 在8x8的西洋棋的棋盤上擺八個皇后,使其不能夠互相攻擊。即任意兩個皇后不能夠處在同一行,同一列,或者是同一斜線,問有多少種擺法?92 思路分析 第乙個皇后放在第一行的第一列 第二個皇后從第二行第一列開始放,然後判斷可不可以,可以,就放第三個皇后,也從第三行第一列開始放 不可以在換下乙個位置,在...

回溯演算法 八皇后

總時間限制 1000ms 記憶體限制 65536kb 描述 會下西洋棋的人都很清楚 皇后可以在橫 豎 斜線上不限步數地吃掉其他棋子。如何將8個皇后放在棋盤上 有8 8個方格 使它們誰也不能被吃掉!這就是著名的八皇后問題。對於某個滿足要求的8皇后的擺放方法,定義乙個皇后串a與之對應,即a b 1b2....