八皇后问题
八皇后问题是一个古老而著名的问题,是回溯算法的典型例题。
该问题是十九世纪著名的数学家高斯1850年提出:在8x8格的国际象棋上摆放八个皇后,使其不能互相攻击,即任意两个皇后
都不能处于同一行、同一列或同一斜线上,问有多少种摆法?
#include <iostream> #include <string.h> #include <stdio.h> using namespace std; int S[8]; int cnt; bool a[8],b[15],c[15]; void Print() { cnt++; printf("%2d: ",cnt); for(int i=0;i<8;i++) cout<<S[i]<<" "; cout<<endl; } void DFS(int i) { for(int j=0;j<8;j++) { if(a[j] == 0 && b[i+j] == 0 && c[i-j+7] == 0) { S[i] = j; a[j] = b[i+j] = c[i-j+7] = 1; if(i < 7) DFS(i+1); else Print(); a[j] = b[i+j] = c[i-j+7] = 0; } } } void Init() { cnt = 0; memset(a,0,sizeof(a)); memset(b,0,sizeof(b)); memset(c,0,sizeof(c)); } int main() { Init(); DFS(0); return 0; }
问题:给两个正整数n和m,输出n个1 ~ m的数字的所有组合。
#include <iostream> #include <string.h> #include <stdio.h> using namespace std; const int N = 25; int ans[N]; void dfs(int dept,int n,int m) { if(dept == n) { for(int i=0;i<n;i++) cout<<ans[i]<<" "; cout<<endl; return; } for(int i=1;i<=m;i++) { ans[dept] = i; dfs(dept+1,n,m); } } int main() { int n,m; while(cin>>n>>m) dfs(0,n,m); return 0; }
问题:给定一个正整数n,输出n的所有排列。
#include <iostream> #include <string.h> #include <stdio.h> using namespace std; const int N = 25; int ans[N]; bool used[N]; int n; void dfs(int dept) { if(dept == n) { for(int i=0;i<n;i++) cout<<ans[i]<<" "; cout<<endl; return; } for(int i=1;i<=n;i++) { if(used[i]) continue; used[i] = true; ans[dept] = i; dfs(dept+1); used[i] = false; } } int main() { while(cin>>n) { memset(used,0,sizeof(used)); dfs(0); } return 0; }