演算法競賽寶典 遞迴演算法 八皇后

2021-08-17 15:52:16 字數 1960 閱讀 4939

八皇后問題,是乙個古老而著名的問題,是

回溯演算法

的典型案例。該問題是國際西洋棋棋手馬克斯·貝瑟爾於2023年提出:在8×8格的西洋棋上擺放八個皇后,使其不能互相攻擊,即任意兩個皇后都不能處於同一行、同一列或同一斜線上,問有多少種擺法。

高斯認為有76種方案。2023年在柏林的象棋雜誌上不同的作者發表了40種不同的解,後來有人用圖論的方法解出92種結果。

//樸素檢查

/*好奇怪的是

我用樸素檢查的時候 n<10時的執行時間

比絕對值演算法效率低

而當n>12開始絕對值演算法的效率開始比樸素演算法的效率低

錯覺?使用逐層遍歷

1.不用對該點下方進行檢查,所以可以省去對下方的查詢

*/#include#include#includeusing namespace std;

#define n 10000

int map[n][n];

int ans[n];

int m, n;

int check(int x,int y)

void dfs(int x)

for (int i = 1; i <= n; i++) }

}int main()

return 0;

}

//行列規律檢查

//這個演算法的效率高很多

#include#includeusing namespace std;

int n,m;

bool y[41], x1[41], x2[41];

int ans[21];

void dfs(int x)

for (int i = 1; i <= n; i++) }

}int main()

return 0;

}

//演算法檢查

#include#include#include#includeusing namespace std;

#define n 21

int ans[n];

int m, n;

int check(int x,int y)

return 1;

}void dfs(int x)

for (int i = 1; i <= n; i++) }

}int main()

return 0;

}

//對稱演算法

/*

改進1*/

#include #include using namespace std;

int ans[20 + 1];

char x1[40 + 1];//斜線數為2*n+1用來判斷正斜線"/"的

char x2[40 + 1];//反斜線"\"上有棋,則作標記

char lie[20 + 1];//解決列衝突,如果第i列有棋,則lie[i]=1,放下一棋時直接檢視lie[i]即可

long m, n;

void dfs(int x, int k)

} }}int main()

return 0;

}

//~取反運算子

#include#includeusing namespace std;

int sum;

int lim;

void queen(int row,int left,int right)

int pos,p;

pos=lim&~(row | left | right);

while(pos) }

int main()

return 0;

}

演算法競賽寶典 遞迴演算法

p1498 南蠻圖騰 include include include using namespace std int n char a 5 5 b 3000 10 3000 10 int main p1049 裝箱問題 include using namespace std int a 30 1 i...

演算法競賽寶典 分治演算法 花費

二分解決,學習了 includeusing namespace std int a 100000 10 int n 天數 int m 規定的分組數 判斷用當前的mid值能把天數n分成幾組 通過比較group與m的大小,對mid值進行優化 int binary int key return cnt i...

sincerit 演算法競賽寶典 放蘋果

放蘋果 問題描述 把m個同樣的蘋果放在n個同樣的盤子裡,允許有的盤子空著不放,問有多少種不同的分法?注 5,1,1和1,1,5是同一種分法 遞迴解法 思考 當n m時 至少有n m個盤子為空 分法數為m個蘋果放入m個盤子 solve m,m 當n m時 有兩種分法 有盤子為空 solve m,n 1...