从一条路往前走,能进则进,不能进则退回到最近的岔路,换一条路再试。算法
在N × N的棋盘上放置N个皇后,这些皇后之间不能相互攻击。(合法位置)编程
(图片转自博客园,目前未通过做者赞成,若有侵权,将当即删除!)函数
void Put_The_Queen_On_The_NOk_Row_And_The_NOj_column(int k, int n) {//须要摆放n个皇后,当前摆放到了第k行。 int j; if(k > n)//发现可行解 print(n); //输出可行解 else { for(j = 1;j <= n;j++) {//试探这一行的每一列 if(Find_The_Valid_Pos(k, j)) {//判断该位置是否合法 q[k] = j; //保存位置 Put_The_Queen_On_The_NOk_Row_And_The_NOj_column(k + 1, n); //继续试探下一行 } } } }
将一个正整数N分解成几个正整数相加,能够有多种分解方法,例如7=6+1,7=5+2,7=5+1+1,…。编程求出正整数N的全部整数分解式子。优化
思路设计
核心代码code
void Division(int x, int pos, int result){ static int counter, array[32]; if(result != N) { for (int i = x; result + i - 1 < N; i++) { array[pos] = i; Division(i, pos + 1, result + i); } } else{ counter++; std::cout << N << '='; for (int i = 0; i < pos - 1; i++) std::cout << array[i] << '+'; if (counter % 4 == 0 || array[pos - 1] == N) std::cout << array[pos - 1] << std::endl; else std::cout << array[pos - 1] << ';'; } }
要求blog
思路递归
注意图片
输入的目标值与全排列数的位数始终是一致的。
核心代码
/*全局变量*/ int whole_array[32]; // 存储当前的全排列数 int sub[32]; //记录每个数字是否被用过 int N; //目标值 /*递归函数*/ void Perm (int x){ static int length = 0; //当前全排列的长度 if(N <= x - 1){ //判断全排列树的长度是否等于目标值 for(int i = 1;i <= N;i++) //输出 printf("%d",whole_array[i]); printf("\n"); } else //只要全排列数的长度小于目标值 for(int i = 1;i <= N;i++) //因为要输出字典序,每个位置从1开始试探 if(sub[i] == 0){ //判断这个数是否被用过 whole_array[x] = i; //将这个数 sub[i] = 1; //填入以后将这个数标记为1,即在该全排列数中已经出现 Perm(x + 1); //到下一个位置继续试探 sub[i] = 0; //若是发生回溯,那么须要从新将这个数字标记为没有出现过 } }
(博客内容为原创,未经容许禁止转载!)