問題描述:西洋棋棋手馬克斯於2023年提出:在8*8的西洋棋放八個皇后,使其不能相互攻擊,即任意兩個皇后不能處於同一行,同一列,或者同一斜線上。(不知道為啥的朋友可以去了解以下西洋棋的基本規則),高斯認為有76種解法,計算機出來後解出92種解法。(終於在數學上可以超過一下天才兒童高斯了o(^▽^)o)
主要演算法:回溯
演算法詳解:使用乙個一維陣列queue[8],因為一行只用放置乙個皇后,所以我們可以用queue[i]的值來儲存這一行放置的列數,而i表示行數,這樣我們只需要乙個一維陣列就可以表示出8行棋盤每行只放置乙個皇后的狀態。演算法的原理主要是:
1.從第1行開始的第乙個位置開始放置;
2.判斷此時放置的位置是否可以放置;(設定乙個函式判斷是否可以放置)
3.若判斷可以放置那麼從下一行的第一列開始設定下一行。若是行數已經到了8行,那麼列印所有的放置位置。若此時的放置位置不可以放置,那麼更改此時放置的位置。(此時,採用回溯演算法,若可以放置則到下一行,不可以放置則返回到上一行。若是不能理解,先去了解遞迴時的系統棧)
4.列印出結果
函式詳解:
check(int n)//check函式來表示當前位置是否可以放置,n表示當前的放置行數。其主要內容如下:
for(i=0;ireturn 1;
for迴圈表示從第1行開始直到現在放置的這一行來檢查是否符合放置規則。因為i和n不相同,所以不需要檢查在同一行的情況。
只需要檢查是否在同一列或者在同一斜線的情況。queue[i]==queue[n]就表示在同一列上有兩個皇后了,注意queue[i]和queue[n]的值代表列,所以他們兩的值不可以相同。對於斜線的檢查,數學原理為|y1-y2|==|x1-x2|。在我們設定的變數中queue[i]和queue[n]的值就相當於x1和x2。i和n就相當於y1和y2.abs是絕對值函式。
put(int n)//放置函式,其內容如下:
int i=0;
for(i=0;imax可在巨集定義中定義其值為8。由第1行開始放置,並且判斷是否可以放置,之後進入回溯。滿8行後列印即可。
完整程式如下,已經在codeblock上執行過了:
#include
#define max 8
int queue[max];
int sum=0;
void show()
{int i=0;
for(i=0;i
QZXing不適用於C 11語法?
重新整理寫過的程式,發現了乙個詭異的問題。將使用了qzxing的源程式包移動到另乙個資料夾後,build,qzxing中的某個檔案出現錯誤。一步步回溯問題可能出現的地方。發現這個程式最開始的版本中並沒有需要c 11支援的語法 如lambda表示式 因此.pro檔案中也沒有config c 11這一句...
C 適用於前後端的多語言架構二
之前做了乙個多語言架構一,就是根據業務需要,自己去弄的乙個架構,但是實現方式其實比較生硬,今天在這就是根據微軟的一些好的api從新把之前的框架優化一下。優化修改內容如下 1 資源檔案的新增 資源檔案的名稱新增乙個語言類別的副檔名 language的資源檔案,儲存中文字元,language.en us...
批量刪除C 注釋(適用於vs開發環境)
題目 批量刪除c 注釋 適用於vs開發環境 方法 第一步 使用ctrl h快捷鍵,開啟查詢替換視窗 第二步 在 查詢選項 中,勾選 使用 正規表示式 第三步 在 查詢內容 中,填寫正規表示式 t n n 第四步 替換為 留空 第五步 單擊 全部替換 按鈕,完成整個專案或者當前文件等替換 舉例 替換前...