面試例題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....