鱼C论坛

 找回密码
 立即注册
查看: 788|回复: 31

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

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

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

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

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


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

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

评分

参与人数 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的模板
  1. type dfs(int x, int y, args){ // 根据情况定义类型及其他参数
  2.         ...; // 特殊情况
  3.         for (int i = 0; i < len; i++){ // 对每个方向搜索
  4.                 // 建立新坐标
  5.                 int xx = x + dx[i];
  6.                 int yy = y + dy[i];
  7.                 // 边界/特殊情况=>失败
  8.                 if (...){
  9.                         continue;
  10.                 }
  11.                 // 防止重复搜索,死循环
  12.                 vis[xx][yy] = true;
  13.                 // 成功/抵达/特殊情况
  14.                 if (...){
  15.                         ...;
  16.                         return;
  17.                 }
  18.                 dfs(xx, yy, args); // 继续向后搜索
  19.                 vis[xx][yy] = false;
  20.         }
  21. }
复制代码

想知道小甲鱼最近在做啥?请访问 -> 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 鱼币

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

  3. void display(char *buff, size_t count) {
  4.     for(size_t i = 0; i < count; ++i) {
  5.         printf("%c", buff[i]);
  6.     }
  7.     puts("");
  8. }

  9. void permutation(char *buff, size_t index, size_t count) {
  10.     if(index == count) {
  11.         display(buff, count);
  12.         return;
  13.     }
  14.     buff[index] = 'N';
  15.     permutation(buff, index + 1, count);
  16.     buff[index] = 'Y';
  17.     permutation(buff, index + 1, count);
  18. }

  19. int main(void) {
  20.     char buff[3];
  21.     permutation(buff, 0, 3);
  22.     return 0;
  23. }
  24. sh-5.2$ gcc -g3 -Wall -o main main.c
  25. sh-5.2$ ./main
  26. NNN
  27. NNY
  28. NYN
  29. NYY
  30. YNN
  31. YNY
  32. YYN
  33. YYY
  34. sh-5.2$
复制代码
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

  3. void display(bool array[6][6]) {
  4.     for(size_t y = 0; y < 6; ++y) {
  5.         for(size_t x = 0; x < 6; ++x) {
  6.             printf("%d ", array[y][x]);
  7.         }
  8.         puts("");
  9.     }
  10.     puts("");
  11. }

  12. bool check(bool array[6][6]) {
  13.     for(size_t y = 0; y < 6; ++y) {
  14.         size_t sum = 0;
  15.         for(size_t x = 0; x < 6; ++x) {
  16.             sum += array[y][x];
  17.         }
  18.         if(sum > 1) return false;
  19.     }
  20.     for(size_t x = 0; x < 6; ++x) {
  21.         size_t sum = 0;
  22.         for(size_t y = 0; y < 6; ++y) {
  23.             sum += array[y][x];
  24.         }
  25.         if(sum > 1) return false;
  26.     }
  27.     for(size_t x = 0; x < 6; ++x) {
  28.         size_t y = 0;
  29.         size_t nx = x;
  30.         size_t sum = 0;
  31.         while(y < 6 && nx < 6) sum += array[y++][nx--];
  32.         if(sum > 1) return false;
  33.     }
  34.     for(size_t y = 5; y < 6; --y) {
  35.         size_t ny = y;
  36.         size_t x = 0;
  37.         size_t sum = 0;
  38.         while(ny < 6 && x < 6) sum += array[ny++][x++];
  39.         if(sum > 1) return false;
  40.     }
  41.     return true;
  42. }

  43. void chess(bool array[6][6], size_t y) {
  44.     if(y == 6) {
  45.         if(check(array)) display(array);
  46.         return;
  47.     }
  48.     for(size_t x = 0; x < 6; ++x) {
  49.         array[y][x] = true;
  50.         chess(array, y + 1);
  51.         array[y][x] = false;
  52.     }
  53. }

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

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-4-28 18:46

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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