1. 循环暴力解法
cint a[9], cnt;
bool check() {
for (int i = 1; i <= 8; i++)
for (int j = i + 1; j <= 8; j++) {
if (a[j] == a[i])
return false;
else if (abs(a[j] - a[i]) == j - i)
return false;
}
return true;
}
int main() {
for (a[1] = 1; a[1] <= 8; a[1]++)
for (a[2] = 1; a[2] <= 8; a[2]++)
for (a[3] = 1; a[3] <= 8; a[3]++)
for (a[4] = 1; a[4] <= 8; a[4]++)
for (a[5] = 1; a[5] <= 8; a[5]++)
for (a[6] = 1; a[6] <= 8; a[6]++)
for (a[7] = 1; a[7] <= 8; a[7]++)
for (a[8] = 1; a[8] <= 8; a[8]++)
if (check()) cnt++;
return 0;
}
2. 循环剪枝
bool check(int k){
for (int i = 1; i < k; i++){
if (a[i] == a[k])
return false;
else
if (abs(a[k] - a[i]) == k - i)
return false;
}
return true;
}
int main(){
for (a[1] = 1; a[1] <= 8; a[1]++)
for (a[2] = 1; a[2] <= 8; a[2]++)
if (check(2))
for (a[3] = 1; a[3] <= 8; a[3]++)
if (check(3))
for (a[4] = 1; a[4] <= 8; a[4]++)
if (check(4))
for (a[5] = 1; a[5] <= 8; a[5]++)
if (check(5))
for (a[6] = 1; a[6] <= 8; a[6]++)
if (check(6))
for (a[7] = 1; a[7] <= 8; a[7]++)
if (check(7))
for (a[8] = 1; a[8] <= 8; a[8]++)
if (check(8))
cnt++;
return 0;
}
3. 深度遍历
int a[9], cnt;
bool check(int k){
for (int i = 1; i < k; i++){
if (a[i] == a[k]) return false;
else if (abs(a[k] - a[i]) == k - i) return false;
}
return true;
}
void dfs(int k){
if (k == 9) cnt++;
else for (int i = 1; i <= 8; i++){
a[k] = i;
if (check(k)) dfs(k + 1);
}
}
4. check O(1)优化
上图两张:


const int maxn = 10;
int a[maxn], col[maxn], diag1[2 * maxn], diag2[2 * maxn], n, cnt;
void dfs(int k){
if (k == n + 1) cnt++;
else for (int j = 1; j <= n; j++){
a[k] = j;
if ( !col[j] && !diag1[k + j - 1] && !diag2[k - j + n] ){
col[j] = diag1[k + j - 1] = diag2[k - j + n] = 1;
dfs(k + 1);
col[j] = diag1[k + j - 1] = diag2[k - j + n] = 0;
}
}
}
133

被折叠的 条评论
为什么被折叠?



