回溯

//求幂集
1
#include<iostream> 2 #include<cstdio> 3 #include<cstdlib> 4 #include<list> 5 using namespace std; 6 const int maxn = 10010; 7 typedef list<int> List; 8 List::iterator it; 9 int a[maxn]; 10 int n; 11 void Output(List l) 12 { 13 if(l.empty()) 14 printf("φ"); 15 else 16 { 17 printf("{"); 18 for(it = l.begin(); it != l.end(); it++) 19 { 20 if(it != l.begin()) printf(" "); 21 printf("%d", *it); 22 } 23 printf("}, "); 24 } 25 } 26 27 void GetPowerSet(int i, List A, List& B) 28 {//求n个元素的集合A的幂集,进入函数时已对A中前i-1个元素作了取舍处理,现对第i个元素进行取舍处理 29 //线性表A表示集合A, 线性表B表示幂集的一个元素 30 //初始调用PowerSet(1, A, B); B为空表 31 if(i>n)//输出幂集的一个元素 32 { 33 Output(B); 34 } 35 else 36 { 37 int x = a[i]; 38 B.push_back(x); 39 GetPowerSet(i+1, A, B); 40 B.pop_back(); 41 GetPowerSet(i+1, A, B); 42 } 43 } 44 int main() 45 { 46 scanf("%d", &n); 47 for(int i = 1; i <= n; i++) a[i] = i; 48 List A(a, a+n), B; 49 printf("{ "); 50 GetPowerSet(1, A, B); 51 printf(" }"); 52 return 0; 53 }

 ======================================================

 //八皇后问题
1
#include<iostream> 2 #include<cstdio> 3 #include<cstdlib> 4 #include<cstring> 5 using namespace std; 6 const int maxn = 1001; 7 int n; 8 int C[maxn]; 9 bool status[3][maxn]; 10 void Output() 11 { 12 for(int i = 0; i < n; i++) 13 { 14 if(i) printf(" "); 15 printf("%d", C[i]); 16 } 17 printf(" "); 18 } 19 20 void Trial(int i) 21 { 22 if(i == n) 23 { 24 Output(); 25 // tot++; 26 } 27 else 28 { 29 for(int j = 0; j < n; j++) 30 { 31 if(!status[0][j] && !status[1][i+j] && !status[2][(i-j+n)]) 32 { 33 C[i] = j; 34 status[0][j] = status[1][i+j] = status[2][(i-j+n)] = 1; 35 Trial(i+1); 36 status[0][j] = status[1][i+j] = status[2][(i-j+n)] = 0; 37 } 38 } 39 } 40 } 41 42 int main() 43 { 44 memset(C, 0, sizeof(C)); 45 memset(status, 0, sizeof(status)); 46 scanf("%d", &n); 47 Trial(0); 48 49 return 0; 50 }
原文地址:https://www.cnblogs.com/LLGemini/p/4069466.html