日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

程序员面试题精选100题(58)-八皇后问题[算法]

發(fā)布時間:2025/3/21 编程问答 27 豆豆
生活随笔 收集整理的這篇文章主要介紹了 程序员面试题精选100题(58)-八皇后问题[算法] 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

題目:在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)ij,是不是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)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。