DFS的熟悉以及题目1月22日

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

今天学的很慢在对深度优先遍历理解感觉还不是很透彻对洛谷里面迷宫的那道题目就只是修改了一点,写出来的代码还是有问题。总而言之我对深度优先遍历还需要再深入学习,争取完完全全的去理解清楚此类问题。

  • 12
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值