当前位置: 首页 > article >正文

dfs算法复习

深度优先算法  一条路走到黑

代码模版如下  将1~n 所有的排列组合方式  列举出来

代码模版

#include <iostream>

using namespace std;
const int N = 10;
int n;
int path[N];
bool a[N];

void def(int u)
{
	if (u == n)
	{
		for (int i = 0; i < n; i++)
		{
			cout << path[i] << ' ';
		}
		puts("");
		return;
	}

	for (int i = 1; i <= n; i++)
	{
		if ( !a[i])//表示该数字还没有被使用
		{
			path[u] = i; //将该值赋给当前位置
			a[i] = true;//将该值标记为已使用
			def(u+1);//遍历下一位
			a[i] = false;
		}
	}
}

int main()
{
	cin >> n;

	def(0);
	return 0;
}

题目

n−皇后问题是指将 n个皇后放在 n×n的国际象棋棋盘上,使得皇后不能相互攻击到,即任意两个皇后都不能处于同一行、同一列或同一斜线上。

现在给定整数 n,请你输出所有的满足条件的棋子摆法。

输入格式

共一行,包含整数 n。

输出格式

每个解决方案占 n行,每行输出一个长度为 n的字符串,用来表示完整的棋盘状态。其中 . 表示某一个位置的方格状态为空,Q 表示某一个位置的方格上摆着皇后。每个方案输出完成后,输出一个空行。 注意:行末不能有多余空格。

数据范围:

1≤n≤9

输入样例:

4

输出样例:

.Q..

...Q

Q...

..Q.

..Q.

Q...

...Q

.Q..

代码

第一种方法思路比较正:

#include <iostream>

using namespace std;
const int N = 1000;

int n;
char a[N][N];
bool row[N], col[N], dg[N], udg[N];
void dfs(int x,int y,int num) // x表示行  y表示列 num 表示用了几个皇后
{
	if (y == n)//表示走到一行的最后一个
	{
		x++;
		y = 0;
	}
	//判断满足的条件
	if (x == n)
	{
		if (num == n)
		{
			for (int i = 0; i < n; i++)
			{
				puts(a[i]);
			}
			puts("");
		}
		return;
	}


	//放皇后
	if (!row[x] && !col[y] && !dg[x + y] && !udg[x - y + n])
	{
		a[x][y] = 'q';
		row[x] = col[y] = dg[x + y] = udg[x - y + n] = true;
		dfs(x, y + 1,num + 1);
		row[x] = col[y] = dg[x + y] = udg[x - y + n] = false;
		a[x][y] = '.';
	}
	//不放皇后
	dfs(x, y + 1, num);
}

int main()
{
	cin >> n;


	for (int i = 0; i < n; i++)
		for (int j = 0; j < n; j++)
			a[i][j] = '.';

	dfs(0, 0, 0);
	return 0;
}

第二种方法

#include <iostream>

using namespace std;
const int N = 1000;

int n;
char q[N][N];

bool st[N], dg[N], udg[N];
void dfs(int u)// 皇后的数量
{
	if (u == n)
	{
		for (int i = 0; i < n; i++)
		{
			puts(q[i]);
		}
		puts("");
		return;
	}

	for (int i = 0; i < n; i++)
	{
		if (!st[i] && !dg[u + i] && !udg[i - u + n])
		{
			q[u][i] = 'q';
			st[i] = dg[u + i] = udg[i - u + n] = true;
			dfs(u + 1);
			st[i] = dg[u + i] = udg[i - u + n] = false;
			q[u][i] = '.';
		}
	}
}

int main()
{
	cin >> n;

	for (int i = 0; i < n; i++)
		for (int j = 0; j < n; j++)
			q[i][j] = '.';

	dfs(0);
	return 0;
}


http://www.kler.cn/a/288363.html

相关文章:

  • C# WPF FontDialog字体对话框,ColorDialog颜色对话框 引用
  • 华为路由策略配置
  • 研究生如何远控实验室电脑?远程办公功能使用教程
  • 重构开发之道,Blackbox.AI为技术注入智能新动力
  • 前端面试笔试(二)
  • 【大数据学习 | HBASE高级】storeFile文件的合并
  • Express与SQLite集成教程:轻松实现数据库操作
  • 【概率与统计 动态规划】 808. 分汤
  • Unity3D DOTS系列之BlobAsset核心机制详解
  • UFUG2601-OJ palindrome
  • idea便捷操作
  • Kubernetes 1.20 上将容器从 Docker Engine 改为 Containerd
  • Idea发布springboot项目无法识别到webapp下面的静态资源
  • <数据集>无人机识别数据集<目标检测>
  • 等保2.0通用部分 | 安全物理环境(三级)测评指导书
  • ai数字人音频停顿处理,删除无用音频段
  • 【C++拓展(一)】后端开发常用的技术栈
  • 在随机点实现凸包包围游戏地区
  • 产品概述Tektronix泰克TCP0030A电流探头TCP0030原装二手
  • 前端bug:v-show嵌套组件外层,页面扩大后,组件被遮挡
  • 使用支持UDP协议的IP是否更加快速?
  • 使用Python+docx+openpyxl将Word表格转换为Excel表格
  • EI论文被引多少次算高引?
  • div嵌套img,去除img下的小空隙
  • <Rust>egui学习之小部件(七):如何在窗口中添加颜色选择器colorpicker部件?
  • 笔记:《利用Python进行数据分析》之透视表和交叉表