全排列(DFS)
(排列树)
(原题:P1706 全排列问题 – 洛谷 | 计算机科学教育新生态 (luogu.com.cn))
题目描述
按照字典序输出自然数 11 到 n 所有不重复的排列,即 n 的全排列,要求所产生的任一数字序列中不允许出现重复的数字。
输入格式
一个整数 n。
输出格式
由 1∼n 组成的所有不重复的数字序列,每行一个序列。
每个数字保留 5 个场宽。
输入输出样例
输入 #1
3
输出 #1
1 2 3
1 3 2
2 1 3
2 3 1
3 1 2
3 2 1
#include <iostream> #include <string> #include <algorithm> #include<math.h> #include<queue> #include<vector> using namespace std; int n; int visit[10];//标记某整数是否被访问 int ans[10];//输出 void dfs(int step) { if (step == n + 1) {//递归出口,第n+1步输出排列 for (int i = 1; i <= n; i++) { printf("%5d", ans[i]); } cout << endl; return; } for (int i = 1; i <= n; i++) {//此for循环用来寻找未被访问过的数 if (visit[i] == 0) {//如果i序列中 visit[i] = 1;//则此次递归将该数加入序列 ans[step] = i; dfs(step + 1);//递归序列的下一位 visit[i] = 0;//还原状态 } } } int main() { cin >> n; dfs(1); }
八皇后问题(回溯)
(原题:P1219 [USACO1.5] 八皇后 Checker Challenge – 洛谷 | 计算机科学教育新生态 (luogu.com.cn))
题目描述
一个如下的 6×6的跳棋棋盘,有六个棋子被放置在棋盘上,使得每行、每列有且只有一个,每条对角线(包括两条主对角线的所有平行线)上至多有一个棋子。
上面的布局可以用序列 2 4 6 1 3 5来描述,第 i 个数字表示在第 i 行的相应位置有一个棋子,如下:
行号 1 2 3 4 5 6
列号 2 4 6 1 3 5
这只是棋子放置的一个解。请编一个程序找出所有棋子放置的解。
并把它们以上面的序列方法输出,解按字典顺序排列。
请输出前 3 个解。最后一行是解的总个数。
输入格式
一行一个正整数 n,表示棋盘是 n×n 大小的。
输出格式
前三行为前三个解,每个解的两个数字之间用一个空格隔开。第四行只有一个数字,表示解的总数。
输入输出样例
输入 #1
6
输出 #1
2 4 6 1 3 5
3 6 2 5 1 4
4 1 5 2 6 3
4
#include <iostream> #include <string> #include <algorithm> #include<math.h> #include<queue> #include<vector> using namespace std; int n; int hang[15]; int lie[15]; int zhengxie[30]; int nixie[30]; int ans[15];//输出 int ans_num = 0; void dfs(int step) {//step==行 if (step == n + 1) { ans_num++; for (int i = 1; i <= n; i++) { cout << ans[i]<<" ";//每一行,输出其列 } cout << endl; } for (int j = 1; j <= n; j++) {//每列每列的放置 if (!(lie[j] || zhengxie[j - step+n] || nixie[j + step])) { //可以放置 ans[step] = j; lie[j] = 1; zhengxie[j - step+n] = 1; nixie[j + step] = 1; dfs(step + 1); lie[j] = 0; zhengxie[j - step+n] = 0; nixie[j + step] = 0; } } } int main() { cin >> n; dfs(1); cout << ans_num; }
void dfs(int step) { if (到达目的地) { 输出解 返回 } 剪枝(可选) for (int i = 1; i <= 枚举数; i++) { if (满足条件) { 更新状态 dfs(step + 1); 恢复状态 } } }
最新评论