鱼C论坛

 找回密码
 立即注册
查看: 5325|回复: 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

查看全部评分

本帖被以下淘专辑推荐:

小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

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

评分

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

查看全部评分

小甲鱼最新课程 -> https://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. }
复制代码

小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2024-7-25 09:20:51 | 显示全部楼层

学习一下
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2024-4-12 15:31:26 | 显示全部楼层

回帖奖励 +2 鱼币

加油
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2024-3-19 11:35:08 | 显示全部楼层

回帖奖励 +2 鱼币

小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2024-3-16 09:51:43 | 显示全部楼层
感谢感谢
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2024-3-2 08:56:29 | 显示全部楼层

回帖奖励 +2 鱼币

小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2024-2-28 22:01:48 | 显示全部楼层

回帖奖励 +2 鱼币

good
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2024-2-26 23:05:12 | 显示全部楼层

回帖奖励 +2 鱼币

学习编程中的Ben 发表于 2024-2-4 21:12
@yinda_peng @人造人 @sfqxx @歌者文明清理员 @alwonwang @zhangchenyvn @zhangjinxuan

新年快乐
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2024-2-21 13:43:08 | 显示全部楼层

回帖奖励 +2 鱼币

感谢讲解
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2024-2-21 11:09:21 | 显示全部楼层

回帖奖励 +2 鱼币

阿萨德
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2024-2-15 05:49:57 | 显示全部楼层
帖子排版不错滴,中英文标点符号能改进更棒!!
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2024-2-15 05:45:45 | 显示全部楼层

回帖奖励 +2 鱼币

小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2024-2-5 09:58:08 | 显示全部楼层

回帖奖励 +2 鱼币

听不懂c/c++ 只会python
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2024-2-5 00:47:33 | 显示全部楼层
6x6的棋盘有4种情况
我承认这个判断斜角的方法不好,但是我没有好的方法

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

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

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

  48. void chess(bool array[6][6], size_t y) {
  49.     if(y == 6) {
  50.         if(check(array)) display(array);
  51.         return;
  52.     }
  53.     for(size_t x = 0; x < 6; ++x) {
  54.         array[y][x] = true;
  55.         chess(array, y + 1);
  56.         array[y][x] = false;
  57.     }
  58. }

  59. int main(void) {
  60.     bool array[6][6] = {false};
  61.     chess(array, 0);
  62.     return 0;
  63. }
  64. sh-5.2$ ./main
  65. 0 1 0 0 0 0
  66. 0 0 0 1 0 0
  67. 0 0 0 0 0 1
  68. 1 0 0 0 0 0
  69. 0 0 1 0 0 0
  70. 0 0 0 0 1 0

  71. 0 0 1 0 0 0
  72. 0 0 0 0 0 1
  73. 0 1 0 0 0 0
  74. 0 0 0 0 1 0
  75. 1 0 0 0 0 0
  76. 0 0 0 1 0 0

  77. 0 0 0 1 0 0
  78. 1 0 0 0 0 0
  79. 0 0 0 0 1 0
  80. 0 1 0 0 0 0
  81. 0 0 0 0 0 1
  82. 0 0 1 0 0 0

  83. 0 0 0 0 1 0
  84. 0 0 1 0 0 0
  85. 1 0 0 0 0 0
  86. 0 0 0 0 0 1
  87. 0 0 0 1 0 0
  88. 0 1 0 0 0 0

  89. sh-5.2$
复制代码
小甲鱼最新课程 -> https://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. }
复制代码
小甲鱼最新课程 -> https://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$
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

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

回帖奖励 +2 鱼币

小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

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

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

使用道具 举报

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

同意同意,暴力嘿嘿

评分

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

查看全部评分

小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

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

回帖奖励 +2 鱼币

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

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

使用道具 举报

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

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

评分

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

查看全部评分

小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-9-26 04:06

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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