aXiangYa

导航

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);
}
}

posted on 2020-07-29 22:46  aXiangYa  阅读(74)  评论(0编辑  收藏  举报