题目描述
blablabla
样例
blablabla
这段代码实现了一个深度优先搜索算法。具体来说,它从一个数组的第一个元素开始,如果该元素没有被访问过,则将其标记为已访问,并将其加入到一个字符串中。然后,递归地访问该元素的下一个未访问过的邻居,直到访问过所有的邻居。
在每次递归调用中,会将当前元素从数组中删除,并将其加入到字符串中。如果已经访问过了所有的邻居,则将计数器减一,并将最后一个字符串出栈。
最终,当计数器等于数组长度时,搜索结束,并将最终结果输出到控制台。
C++ 代码
#include <string.h>
using namespace std;
// 定义一个深度优先搜索的函数,用于生成所有可能的排列组合
void deep(int n ,bool m[],string str,int count);
int main(){
bool m[8]; // 定义一个布尔数组,用于标记数字是否被使用
int n;
cin>>n; // 输入数字的个数
string str=""; // 定义一个字符串,用于存储当前的排列组合
memset(m, true, sizeof(m)); // 初始化布尔数组,所有元素都为true
deep(n,m,str,0); // 调用深度优先搜索函数,开始生成排列组合
}
void deep(int n ,bool m[],string str,int count) {
for (int i = 1; i <= n; ++i) { // 遍历所有数字
if (m[i] == true) { // 如果当前数字未被使用
m[i] = false; // 标记当前数字为已使用
str.append(to_string(i)); // 将当前数字添加到字符串中
str.append(" "); // 添加一个空格,用于分隔数字
deep(n, m,str,++count); // 递归调用深度优先搜索函数,生成下一个排列组合
if (count==n){ // 如果所有数字都已经被使用
cout<<str<<endl; // 输出当前排列组合
}
count--; // 回溯,将计数器减1
str.pop_back(); // 删除字符串的最后两个字符(一个数字和一个空格)
str.pop_back();
m[i] = true; // 标记当前数字为未使用,准备下一次遍历
}
}
}