AcWing 842. 排列数字 && AcWing 843. n-皇后问题
842. 排列数字(全排列)
题面:
给定一个整数,将数字 排成一排,将会有很多种排列方法。
现在,请你按照字典序将所有的排列方法输出。
#include <iostream> using namespace std; const int N = 10; int path[N];//保存序列 bool st[N];//数字是否被用过,bool类型的全局变量默认都为FALSE int n; //n定义全局,则dfs函数不需要两个参数? void dfs(int u) { if (u == n) { //u始终未变,保证每次都是从头开始遍历 for (int i = 0; i < n; i++) //此时st数组里面一定全是1,不会进入下面的for循环 cout << path[i] << " "; cout << endl; //puts(" "); return; //回溯操作在return,return完这个递归就结束了 } for (int i = 1; i <= n; i++) { //退出dfs不仅靠return,循环结束即意味着函数结束 if (!st[i]) { //当前该数没有被用过 path[u] = i; st[i] = true; dfs(u + 1); st[i] = false; //逐个退出函数,逐个恢复现场 } } } int main() { cin >> n; dfs(0); return 0; }
843. n-皇后问题
题面:
将个皇后放在 的国际象棋棋盘上,使得皇后不能相互攻击到,即任意两个皇后都不能处于同一行、同一列或同一斜线上。
现在给定整数,请你输出所有的满足条件的棋子摆法。
#include <bits/stdc++.h> using namespace std; const int N = 10; int n; char m[N][N]; bool col[N], dg[N], udg[N]; //列,对角,反对角 void dfs(int u) { int x = u; //逐行递归 for (int y = 0; y < n; y++) { //在经过的列/对角线/反对角线上该点都没有其余皇后 if (!col[y] && !dg[x + y] && !udg[n - x + y]) { m[x][y] = 'Q'; col[y] = dg[x + y] = udg[x + y] = true; dfs(x + 1); col[y] = dg[x + y] = udg[x + y] = false; m[x][y] = '.'; } } //递归达到最大深度,输出整行 if (u == n) { for (int i = 0; i < n; i++) cout << m[i] << endl; cout << endl; } } int main() { cin >> n; for (int i = 0; i < n; i++) for (int j = 0; j < n; j++) m[i][j] = '.'; dfs(0); }
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 分享4款.NET开源、免费、实用的商城系统
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了
· 上周热点回顾(2.24-3.2)