鱼C论坛

 找回密码
 立即注册
查看: 3168|回复: 32

[技术交流] 新手必看·DFS快速入门(鱼币~~~)

[复制链接]
发表于 2024-2-4 21:11:18 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
本帖最后由 学习编程中的Ben 于 2024-2-4 21:50 编辑


Hello everyone,欢迎来到 新手必看系列 第二期.因某些人强烈要求,这期决定出 DFS 入门的教程[/s]

还请大家多多欢迎~让我们进入正题吧.

评分

参与人数 11荣誉 +36 鱼币 +25 贡献 +30 收起 理由
鱼小二 + 2 + 2 + 2 鱼C有你更精彩^_^
the_ben + 1 + 1 鱼C有你更精彩^_^
陶远航 + 5 + 5 + 3
skeorl + 2 + 2 + 3
Mike_python小 + 7 + 5
中英文泡椒 + 2 + 3 + 3
zhangchenyvn + 5 + 3
鱼C-小师妹 + 2 + 2 + 2 可以~
cjjJasonchen + 5 + 3
陈尚涵 + 3

查看全部评分

本帖被以下淘专辑推荐:

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2024-2-4 21:12:35 | 显示全部楼层
@yinda_peng @人造人 @sfqxx @歌者文明清理员 @alwonwang @zhangchenyvn @zhangjinxuan

评分

参与人数 1荣誉 +5 贡献 +3 收起 理由
陶远航 + 5 + 3

查看全部评分

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2024-2-4 21:36:46 | 显示全部楼层
本帖最后由 陈尚涵 于 2024-2-4 21:38 编辑

个人认为这个仅仅只是学到了dfs的思路,还可以进一步进阶,找一些二维的搜索题作为练习巩固(至少我学的时候就是这么学的),二维搜索的学习可以解决很多问题(指暴力
这里献上二维dfs的模板
type dfs(int x, int y, args){ // 根据情况定义类型及其他参数 
        ...; // 特殊情况
        for (int i = 0; i < len; i++){ // 对每个方向搜索 
                // 建立新坐标 
                int xx = x + dx[i];
                int yy = y + dy[i];
                // 边界/特殊情况=>失败 
                if (...){
                        continue;
                }
                // 防止重复搜索,死循环 
                vis[xx][yy] = true;
                // 成功/抵达/特殊情况 
                if (...){
                        ...;
                        return;
                }
                dfs(xx, yy, args); // 继续向后搜索 
                vis[xx][yy] = false;
        }
}
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2024-2-4 21:12:34 | 显示全部楼层
首楼。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2024-2-4 21:13:39 | 显示全部楼层

评分评分

评分

参与人数 1荣誉 +5 贡献 +3 收起 理由
陶远航 + 5 + 3

查看全部评分

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2024-2-4 21:15:16 From FishC Mobile | 显示全部楼层
没额度了,每天给你评分
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2024-2-4 21:15:51 | 显示全部楼层
陶远航 发表于 2024-2-4 21:15
没额度了,每天给你评分

谢谢啦

评分

参与人数 1荣誉 +5 贡献 +3 收起 理由
陶远航 + 5 + 3

查看全部评分

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 0 反对 1

使用道具 举报

 楼主| 发表于 2024-2-4 21:40:07 | 显示全部楼层
陈尚涵 发表于 2024-2-4 21:36
个人认为这个仅仅只是学到了dfs的思路,还可以进一步进阶,找一些二维的搜索题作为练习巩固(至少我学的时 ...

二维的讲解太麻烦了。。。
八皇后那道题目就是二维.但太复杂了

评分

参与人数 1荣誉 +4 贡献 +3 收起 理由
陶远航 + 4 + 3

查看全部评分

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2024-2-4 21:40:52 | 显示全部楼层
陈尚涵 发表于 2024-2-4 21:36
个人认为这个仅仅只是学到了dfs的思路,还可以进一步进阶,找一些二维的搜索题作为练习巩固(至少我学的时 ...

反正原理一样。把我那几道题做了差不多就掌握了

评分

参与人数 1贡献 +3 收起 理由
陶远航 + 3

查看全部评分

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2024-2-4 21:42:35 | 显示全部楼层
加油
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2024-2-4 21:42:43 | 显示全部楼层
学习编程中的Ben 发表于 2024-2-4 21:40
二维的讲解太麻烦了。。。
八皇后那道题目就是二维.但太复杂了

我刚学的时候第一道dfs题就是二维
复杂倒是还好,领悟了的话那确实就领悟了
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2024-2-4 21:44:03 | 显示全部楼层

回帖奖励 +2 鱼币

确实。应该讲讲题
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2024-2-4 21:44:34 | 显示全部楼层
陈尚涵 发表于 2024-2-4 21:42
我刚学的时候第一道dfs题就是二维
复杂倒是还好,领悟了的话那确实就领悟了

有些新手学习能力没那么强.循序渐进吧

评分

参与人数 1贡献 +3 收起 理由
陶远航 + 3

查看全部评分

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2024-2-4 21:45:51 | 显示全部楼层
陈尚涵 发表于 2024-2-4 21:42
我刚学的时候第一道dfs题就是二维
复杂倒是还好,领悟了的话那确实就领悟了

如果刚学编程直接上二维不太好吧.
会把人看得头晕.一维能够更快的理解原理
之后多刷题就好了

评分

参与人数 1贡献 +3 收起 理由
陶远航 + 3

查看全部评分

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2024-2-4 21:46:32 | 显示全部楼层

回帖奖励 +2 鱼币

学习编程中的Ben 发表于 2024-2-4 21:40
反正原理一样。把我那几道题做了差不多就掌握了

这种题中dfs只是一个暴力查找的思路,而二维的思路确实是一样的,但是过程差别很大
毕竟升维后要考虑的因素会非常多,但是只要掌握了还是很有用的,很多题就可以直接薄纱(指暴力被杀)
总之即便是二维的dfs也是基础的内容如果要学习更多的话,还是先学习一下暴力比较好
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2024-2-4 21:48:30 | 显示全部楼层
陈尚涵 发表于 2024-2-4 21:46
这种题中dfs只是一个暴力查找的思路,而二维的思路确实是一样的,但是过程差别很大
毕竟升维 ...

同意同意,暴力嘿嘿

评分

参与人数 1贡献 +3 收起 理由
陶远航 + 3

查看全部评分

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2024-2-4 21:48:31 | 显示全部楼层
学习编程中的Ben 发表于 2024-2-4 21:45
如果刚学编程直接上二维不太好吧.
会把人看得头晕.一维能够更快的理解原理
之后多刷题就好了

二维dfs其实算基础的,毕竟只是个偏分的保利算法,难度嘛,emmm,除了解除死循环的代码外,新手只要认真做了我觉得其他代码可以写出来
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2024-2-4 22:37:11 | 显示全部楼层

回帖奖励 +2 鱼币

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2024-2-4 23:30:35 | 显示全部楼层

回帖奖励 +2 鱼币

sh-5.2$ cat main.c
#include <stdio.h>

void display(char *buff, size_t count) {
    for(size_t i = 0; i < count; ++i) {
        printf("%c", buff[i]);
    }
    puts("");
}

void permutation(char *buff, size_t index, size_t count) {
    if(index == count) {
        display(buff, count);
        return;
    }
    buff[index] = 'N';
    permutation(buff, index + 1, count);
    buff[index] = 'Y';
    permutation(buff, index + 1, count);
}

int main(void) {
    char buff[3];
    permutation(buff, 0, 3);
    return 0;
}
sh-5.2$ gcc -g3 -Wall -o main main.c
sh-5.2$ ./main
NNN
NNY
NYN
NYY
YNN
YNY
YYN
YYY
sh-5.2$
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2024-2-5 00:17:00 | 显示全部楼层
不知道代码对不对,6x6的棋盘有74种情况?
#include <stdio.h>
#include <stdbool.h>

void display(bool array[6][6]) {
    for(size_t y = 0; y < 6; ++y) {
        for(size_t x = 0; x < 6; ++x) {
            printf("%d ", array[y][x]);
        }
        puts("");
    }
    puts("");
}

bool check(bool array[6][6]) {
    for(size_t y = 0; y < 6; ++y) {
        size_t sum = 0;
        for(size_t x = 0; x < 6; ++x) {
            sum += array[y][x];
        }
        if(sum > 1) return false;
    }
    for(size_t x = 0; x < 6; ++x) {
        size_t sum = 0;
        for(size_t y = 0; y < 6; ++y) {
            sum += array[y][x];
        }
        if(sum > 1) return false;
    }
    for(size_t x = 0; x < 6; ++x) {
        size_t y = 0;
        size_t nx = x;
        size_t sum = 0;
        while(y < 6 && nx < 6) sum += array[y++][nx--];
        if(sum > 1) return false;
    }
    for(size_t y = 5; y < 6; --y) {
        size_t ny = y;
        size_t x = 0;
        size_t sum = 0;
        while(ny < 6 && x < 6) sum += array[ny++][x++];
        if(sum > 1) return false;
    }
    return true;
}

void chess(bool array[6][6], size_t y) {
    if(y == 6) {
        if(check(array)) display(array);
        return;
    }
    for(size_t x = 0; x < 6; ++x) {
        array[y][x] = true;
        chess(array, y + 1);
        array[y][x] = false;
    }
}

int main(void) {
    bool array[6][6] = {false};
    chess(array, 0);
    return 0;
}
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-12-22 13:17

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表