首页 > 其他分享 >AcWing 842. 排列数字 && AcWing 843. n-皇后问题

AcWing 842. 排列数字 && AcWing 843. n-皇后问题

时间:2023-12-04 11:45:33浏览次数:22  
标签:843 int dg dfs ++ && col AcWing

842. 排列数字(全排列)

题面:
给定一个整数 \(n\),将数字 \(1∼n\) 排成一排,将会有很多种排列方法。
现在,请你按照字典序将所有的排列方法输出。

#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-皇后问题

题面:
将 \(n\) 个皇后放在 \(n×n\) 的国际象棋棋盘上,使得皇后不能相互攻击到,即任意两个皇后都不能处于同一行、同一列或同一斜线上。
现在给定整数 \(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);
}

标签:843,int,dg,dfs,++,&&,col,AcWing
From: https://www.cnblogs.com/haruhomu/p/17874572.html

相关文章

  • AcWing 828. 模拟栈
    题面:实现一个栈,栈初始为空,支持四种操作:pushx–向栈顶插入一个数\(x\);pop–从栈顶弹出一个数;empty–判断栈是否为空;query–查询栈顶元素。现在要对栈进行\(M\)个操作,其中的每个操作\(3\)和操作\(4\)都要输出相应的结果。原题链接:828.模拟栈-AcWing//......
  • AcWing 3302. 表达式求值
    题面:给定一个表达式,其中运算符仅包含加减乘除,可能包含括号,请你求出表达式的最终值。原题链接:3302.表达式求值-AcWing基本思路创建两个栈,分别存储数字和运算符运算符的判定:仅在以下条件满足时将运算符直接压入栈中:①栈中不存在元素②当前运算符优先级比栈顶高③栈顶为......
  • AcWing 154. 滑动窗口
    题面:给定一个大小为\(n≤10^6\)的数组。有一个大小为\(k\)的滑动窗口,它从数组的最左边移动到最右边。你只能在窗口中看到\(k\)个数字。每次滑动窗口向右移动一个位置。你的任务是确定滑动窗口位于每个位置时,窗口中的最大值和最小值。原题链接:154.滑动窗口-AcWing......
  • AcWing 785. 快速排序
    题面:给定你一个长度为\(n\)的整数数列。请你使用快速排序对这个数列按照从小到大进行排序。并将排好序的数列按顺序输出。原题链接:785.快速排序-AcWing需要注意的几个点:左右哨兵的发动顺序;相同元素的相对位置;边界划分问题[1]。#include<bits/stdc++.h>usingna......
  • AcWing 4. 多重背包问题
    题面:有\(N\)件物品和一个容量是\(V\)的背包。第\(i\)件物品最多有\(s_i\)件,每件体积是\(v_i\),价值是\(w_i\)。求解将哪些物品装入背包,可使这些物品的体积总和不超过背包容量,且价值总和最大。输出最大价值。原题链接:4.多重背包问题I-AcWing多重背包实际上沿......
  • AcWing 5. 多重背包问题 II
    题面:有\(N\)件物品和一个容量是\(V\)的背包。第\(i\)件物品最多有\(s_i\)件,每件体积是\(v_i\),价值是\(w_i\)。求解将哪些物品装入背包,可使这些物品的体积总和不超过背包容量,且价值总和最大。输出最大价值。原题链接:5.多重背包问题II-AcWing先前的思路[1]:将......
  • AcWing 3. 完全背包问题
    题面:有\(N\)种物品和一个容量是\(V\)的背包,每种物品都有无限件可用。第\(i\)种物品的体积是\(v_i\),价值是\(w_i\)。求解将哪些物品装入背包,可使这些物品的总体积不超过背包容量,且总价值最大。输出最大价值。原题链接:3.完全背包问题-AcWing根据01背包的思路扩......
  • AcWing 2. 01背包问题
    题面:有 \(N\) 件物品和一个容量是 \(V\) 的背包。每件物品只能使用一次。第 \(i\) 件物品的体积是 \(v_i\),价值是 \(w_i\)。求解将哪些物品装入背包,可使这些物品的总体积不超过背包容量,且总价值最大。输出最大价值。原链接:2.01背包问题-AcWing有限集的最优问......
  • Acwing第132场周赛
    AcWing5366.大小写转换#include<bits/stdc++.h>#definelsp<<1#definersp<<1|1#definePIIpair<int,int>#definelllonglong#definedbdouble#defineullunsignedlonglong#defineendl'\n'#defineioios::sync_with_......
  • 前缀和/差分——acwing算法基础课笔记
    个人笔记,欢迎补充,指正。一维前缀和对于数组:a[1],a[2],a[3]...a[n];其前缀和数组为s[i]=a[1]+a[2]+...+a[i];下标必须从1开始求前缀和1for(inti=1;i<n;++i)2s[i]=s[i-1]+a[i];s[0]需要定义为0作用求原数组里一段数(l,r)的和......