程序员面试题精选100题(58)-八皇后问题[算法]
題目:在8×8的國際象棋上擺放八個皇后,使其不能相互攻擊,即任意兩個皇后不得處在同一行、同一列或者同一對角斜線上。下圖中的每個黑色格子表示一個皇后,這就是一種符合條件的擺放方法。請求出總共有多少種擺法。
| ? | ? | ? | ? | ? | ? | ? | ? |
| ? | ? | ? | ? | ? | ? | ? | ? |
| ? | ? | ? | ? | ? | ? | ? | ? |
| ? | ? | ? | ? | ? | ? | ? | ? |
| ? | ? | ? | ? | ? | ? | ? | ? |
| ? | ? | ? | ? | ? | ? | ? | ? |
| ? | ? | ? | ? | ? | ? | ? | ? |
| ? | ? | ? | ? | ? | ? | ? | ? |
這就是有名的八皇后問題。解決這個問題通常需要用遞歸,而遞歸對編程能力的要求比較高。因此有不少面試官青睞這個題目,用來考察應(yīng)聘者的分析復(fù)雜問題的能力以及編程的能力。
由于八個皇后的任意兩個不能處在同一行,那么這肯定是每一個皇后占據(jù)一行。于是我們可以定義一個數(shù)組ColumnIndex[8],數(shù)組中第i個數(shù)字表示位于第i行的皇后的列號。先把ColumnIndex的八個數(shù)字分別用0-7初始化,接下來我們要做的事情就是對數(shù)組ColumnIndex做全排列。由于我們是用不同的數(shù)字初始化數(shù)組中的數(shù)字,因此任意兩個皇后肯定不同列。我們只需要判斷得到的每一個排列對應(yīng)的八個皇后是不是在同一對角斜線上,也就是數(shù)組的兩個下標(biāo)i和j,是不是i-j==ColumnIndex[i]-Column[j]或者j-i==ColumnIndex[i]-ColumnIndex[j]。
關(guān)于排列的詳細(xì)討論,詳見本系列博客的第28篇,《字符串的排列》,這里不再贅述。
接下來就是寫代碼了。思路想清楚之后,編碼并不是很難的事情。下面是一段參考代碼:
int g_number = 0;void EightQueen() {const int queens = 8;int ColumnIndex[queens];for(int i = 0; i < queens; ++ i)ColumnIndex[i] = i;Permutation(ColumnIndex, queens, 0); }void Permutation(int ColumnIndex[], int length, int index) {if(index == length){if(Check(ColumnIndex, length)){++ g_number;PrintQueen(ColumnIndex, length);}}else{for(int i = index; i < length; ++ i){int temp = ColumnIndex[i];ColumnIndex[i] = ColumnIndex[index];ColumnIndex[index] = temp;Permutation(ColumnIndex, length, index + 1);temp = ColumnIndex[index];ColumnIndex[index] = ColumnIndex[i];ColumnIndex[i] = temp;}} }bool Check(int ColumnIndex[], int length) {for(int i = 0; i < length; ++ i){for(int j = i + 1; j < length; ++ j){if((i - j == ColumnIndex[i] - ColumnIndex[j])|| (j - i == ColumnIndex[i] - ColumnIndex[j]))return false;}}return true; }void PrintQueen(int ColumnIndex[], int length) {printf("Solution %d\n", g_number);for(int i = 0; i < length; ++i)printf("%d\t", ColumnIndex[i]);printf("\n"); }
博主何海濤對本博客文章享有著作權(quán)。網(wǎng)絡(luò)轉(zhuǎn)載請注明出處http://zhedahht.blog.163.com/。整理出版物請和作者聯(lián)系。對解題思路有任何建議,歡迎在評論中告知,或者加我微博http://weibo.com/zhedahht或者http://t.163.com/zhedahht與我討論。謝謝。
總結(jié)
以上是生活随笔為你收集整理的程序员面试题精选100题(58)-八皇后问题[算法]的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 程序员面试题精选100题(59)-字符串
- 下一篇: 程序员面试题精选100题(60)-判断二