DFS:优先考虑深度,换句话说就是有一条岔路口先选择一条路走到底,直到走到无路可走了再返回到岔路口选择另外一条,以此类推。此方法时候求解多少条方法等类型的问题。
就那里面的全排列问题和迷宫问题来举例吧。
全排列:
#include<stdio.h>
int a[10],book[10],n;
//这里还有需要注意的地方C语言全局变量默认为0
void dfs(int step){ //此时在第step盒子面前,需要往里面放第i张扑克牌
int i;
if(step==n+1){ //这里说明前面的n个盒子已经放好了,这是dfs结束的标志
for(i=1;i<=n;i++)
printf("%d",a[i]);
printf("\n");
return ;
}
for(int i=1;i<=n;i++){
if(book[i]==0){ //说明i号扑克牌还在手里,需要放入step号盒子
a[step]=i;//将i号扑克牌放到第step个盒子中
book[i]=1;//此时i号扑克牌已经被使用
dfs(step+1);
/*注意这里是自己调用自己,表示此时走到了第step+1个盒子面前*/
book[i]=0;
/*book[i]=0//回溯
*/
}
}
return;//这里表示这一级别的dfs函数已经结束了,返回上一级 dfs函数
}//我认为最后这个return其实可有可无。真正的回溯是当前放进去的扑克又取出来就相当于回溯。
int main(){
scanf("%d",&n);
dfs(1); //dfs函数的开始
return 0;
}
我认为完成这类的题目需要注意回溯的要求。
验证栈的序列
从头开始,按入栈顺序入栈,如果栈顶与出栈序列的最前面的数相同,就将其弹出最后将所有入栈的数都入栈后,判断栈中剩下的数与出栈序列中剩下的数顺序相同,就按照上面的方式依次弹出,直到无法弹出或栈为空如果栈为空,则出栈序列是合法的,输出"Yes",不为空输出"No"。代码如下#include <stdio.h>
#include <stdlib.h>
#define MAX_SIZE 100010
int stack[MAX_SIZE];
int top;
void push(int x) {
stack[++top] = x;
}
int main() {
int n;
scanf("%d", &n);
for (int i = 0; i < n; i++)
{
int len, js = 1;
scanf("%d", &len);
int jin[MAX_SIZE], chu[MAX_SIZE];
for (int j = 1; j <= len; j++) {
scanf("%d", &jin[j]);
}
for (int j = 1; j <= len; j++) {
scanf("%d", &chu[j]);
}
for (int j = 1; j <= len; j++) {
push(jin[j]);
while (stack[top] == chu[js] && stack[top] && chu[js]) {
top--;
js++;
}
}
if (top != 0) {
printf("No\n");
} else {
printf("Yes\n");
}
top = 0;
}
return 0;
}
今天学的很慢在对深度优先遍历理解感觉还不是很透彻对洛谷里面迷宫的那道题目就只是修改了一点,写出来的代码还是有问题。总而言之我对深度优先遍历还需要再深入学习,争取完完全全的去理解清楚此类问题。