直接利用回溯法:
#include <stdio.h>int n, tot = 0;int C[1000] = {0};void search(int cur){ if(cur == n){ //边界 tot++; } else { for(int i = 0; i < n; i++){ int ok = 1; C[cur] = i; //尝试把第cur行的皇后放在第i位 for(int j = 0; j < cur; j++){ //检验是否有冲突 if(C[cur] == C[j] || cur - C[cur] == j - C[j] || cur + C[cur] == j + C[j]){ ok = 0; break; } } if(ok) search(cur + 1); //放在这个位置可以 } }}int main(){ scanf("%d", &n); search(0); PRintf("%d/n", tot); return 0;}将每一种结果输出:
#include <stdio.h>int n, tot = 0;int C[1000];void show(int cur){ if(cur == n){ tot++; for(int i = 0; i < n; i++){ for(int j = 0; j < n; j++){ if(j == C[i]){ printf("h "); } else { printf("+ "); } } printf("/n"); } printf("/n/n"); } else { for(int i = 0; i < n; i++){ int ok = 1; C[cur] = i; for(int j = 0; j < cur; j++){ if(C[cur] == C[j] || cur - C[cur] == j - C[j] || cur + C[cur] == j + C[j]){ ok = 0; break; } } if(ok) show(cur + 1); } }}int main(){ scanf("%d", &n); show(0); printf("%d", tot); return 0;}
新闻热点
疑难解答