dfs(深度优先搜索)
1.dfs概念:https://www.bilibili.com/video/BV1Ks411579J?from=search&seid=2427847616340458981
dfs算法运用的时候就是找一个头结点,然后沿着这个头结点一直找下去,直到走到最后一个满足条件的分节点,然后再寻找另一条路径,当沿着一条路走不满足条件时会自动的跳入上一层节点进行判断,dfs算法通常与回溯算法一起使用。
------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
2.dfs算法运用的例子及及讲解:https://blog.csdn.net/sinat_35121480/article/details/53036775;
关于“八皇后”问题的另一种解法:
这一列数字表示每一行皇后所在的列数(如第一个皇后在第一行第一列,第二个皇后在第二行第五列)
这种思路的具体代码:
#include<iostream> //把代码中的8替换成n就可以求解n皇后问题
#include<cmath>
using namespace std;
bool b[10]; //b[]只是用来表示第num行有无皇后,如果b[i]==0则没有,反之则有皇后
int a[10]; //a[num]的意思是表示皇后在第num行第a[num]列(即a[]表示皇后所在列数)
void dfs(int num); //num用来表示函数(第num行)
void out();
int main()
{
dfs(1);
return 0;
}
void dfs(int num)
{
if (num > 8)
{
out(); return;
}
for (int i = 1;i <= 8;i++)
{
if (b[i] == false)
{
b[i] = true;
a[num] = i;
dfs(num + 1); //寻找下一行的解
b[i] = false; //不论这次是否找到解都要回溯到上一级,清空这一级。
a[num] = 0;
}
}
}
void out()
{
int i, j;
for (i = 1;i <= 7;i++)
for (j = i + 1;j <= 8;j++)
if (abs(i-j)==abs(a[i]-a[j])) return; //判断对角线上是否存在两个皇后
for (i = 1;i <= 8;i++)
cout << '(' << i << ',' << a[i] << ')' << endl;
cout << endl;
}
------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
3.洛谷中关于dfs算法的题目:https://www.luogu.com.cn/problem/P1157
具体代码:
#include<iostream>
#include<iomanip>
using namespace std;
int n, r, a[100];
void dfs(int k);
int main()
{
cin >> n >> r;
dfs(1);
return 0;
}
void dfs(int k)
{
int i;
if (k > r) //注意当k>r的时候才输出
{
for (i = 1;i <= r;i++)
cout << setw(3) << a[i];
cout << endl;
return;
}
for (i = a[k - 1] + 1;i <= n;i++) //i的初始值为上一个数加+1(即下一位数)
{
a[k] = i;
dfs(k + 1);
}
}