目录

  • 问题 A: 【递归入门】全排列 【简单】
  • 问题 B: 【递归入门】组合的输出 【简单】
  • 问题 C: 【递归入门】组合+判断素数 【中】
  • 问题 D: 【递归入门】n皇后 问题(原始的8皇后问题)【中】
  • 问题 E: 【递归入门】出栈序列统计 【中】
  • 问题 F: 【递归入门】走迷宫 【中】

问题 A: 【递归入门】全排列 【简单】


http://codeup.cn/problem.php?cid=100000608&pid=0

#include<cstdio>
#include<string>
#include<cstring>
#include<iostream>
#include<algorithm>
#define max 15using namespace std;
int a[max];//保存记录
int n;
bool b[max];//保存当前的状态
void dfs(int index)
{if(index==n+1){for(int i=1;i<=n;i++){printf("%d ",a[i]);}printf("\n");return;}int i;for(i=1;i<=n;i++){if(b[i]==false){b[i]=true;a[index]=i;dfs(index+1);b[i]=false;//恢复现场}}
}
int main(void)
{cin>>n;dfs(1);return 0;
}

问题 B: 【递归入门】组合的输出 【简单】

http://codeup.cn/problem.php?cid=100000608&pid=1

#include<cstdio>
#include<string>
#include<cstring>
#include<iostream>
#include<algorithm>
#define max 15using namespace std;
int a[max];
int n;
int r;
bool b[max];
void dfs(int index,int start)//当前选的是第几个数, strat从哪里开始选  确保不重复
{if(index==r+1){for(int i=1;i<=r;i++){printf("%d ",a[i]);}printf("\n");return;}int i;for(i=start;i<=n;i++){if(b[i]==false){b[i]=true;a[index]=i;dfs(index+1,i);b[i]=false;}}
}
int main(void)
{cin>>n>>r;dfs(1,1);return 0;
}

问题 C: 【递归入门】组合+判断素数 【中】

http://codeup.cn/submitpage.php?cid=100000608&pid=2&langmask=0

#include<cstdio>
#include<string>
#include<cstring>
#include<iostream>
#include<algorithm>
#include<cmath>
#include<map>
#define max 30using namespace std;
int a[max];//数据
int c[max];//保存选的方式
bool b[max];//选没选
int n;
int k;
int ans=0;//总数
//map<int,bool>ways;//记录这个数选没选bool judge(int sum)
{int i=2;if(sum==2)return true;if(sum==1)return false;while(i<= (int)sqrt(1.0*sum) ){if(sum%i==0)return false;i++;}return true;
}
void dfs(int index,int start)
{if(index==k+1){long long sum=0;for(int i=1;i<=k;i++){sum+=c[i];}if(judge(sum)){ans++;}return;}int i;for(i=start;i<=n;i++){if(b[i]==false){b[i]=true;c[index]=a[i];dfs(index+1,i);b[i]=false;}}
}
int main(void)
{while(cin>>n>>k){for(int i=1;i<=n;i++){cin>>a[i];}dfs(1,1);printf("%d\n",ans);ans=0;}return 0;
}

第二种方法:

#include<cstdio>
#include<iostream>
#include<cmath>
using namespace std;
int n,r;
int a[30];
int b[30];
int ans=0;
bool judge(int s)
{if(s==2) return true;int temp=sqrt(s);for(int i=2;i<=temp;i++){if(s%i==0)return false;}return true;
}
void dfs(int index,int sum)//第几个选,选了几个
{if(sum>r) return;//选的个数超过 rif(index==n){if(sum==r){int m=0;for(int i=0;i<n;i++){if(b[i]==1){m+=a[i];}}if(judge(m))ans++;}return ;}b[index]=1;//选dfs(index+1,sum+1);b[index]=2;//不选dfs(index+1,sum);
}
int main(void)
{cin>>n>>r;for(int i=0;i<n;i++) cin>>a[i];dfs(0,0);cout<<ans<<endl;return 0;
}

问题 D: 【递归入门】n皇后 问题(原始的8皇后问题)【中】

#include<cstdio>
#include<iostream>
#include<cmath>
using namespace std;
int n;
bool flag=true;
int a[20];
bool b[20];
void dfs(int index)
{if(index==n+1){for(int i=1;i<=n;i++){for(int j=i+1;j<=n;j++){if(abs(i-j)==abs(a[i]-a[j]))//判断是否在对角线上{return;}}}for(int i=1;i<=n;i++) printf("%d ",a[i]);flag=false;printf("\n");return ;}for(int i=1;i<=n;i++){if(!b[i]){b[i]=true;a[index]=i;dfs(index+1);b[i]=false;}}
}
int main(void)
{cin>>n;dfs(1);if(flag)printf("no solute!\n");return 0;
}

用现有的全排列函数

#include<cstdio>
#include<iostream>
#include<cmath>
#include<algorithm>
using namespace std;
int a[30];
bool flag=false;
int main(void)
{int n; cin>>n;for(int i=1;i<=n;i++) a[i]=i;do{bool f=false;for(int i=1;i<n;i++){for(int j=i+1;j<=n;j++){if(abs(i-j)==abs(a[i]-a[j])){f=true;break;}}if(f) break;   }if(f) continue;for(int i=1;i<=n;i++) printf("%d ",a[i]);printf("\n");flag=true;}while(next_permutation(a+1,a+n+1));if(!flag){printf("no solute!\n");}return 0;
}

问题 E: 【递归入门】出栈序列统计 【中】


http://codeup.cn/problem.php?cid=100000608&pid=4

#include <iostream>
#include <algorithm>
using namespace std;
int counts;
void dfs(int in, int out)
{if (out == 0)counts++;else if (in == 0){dfs(in + 1, out - 1);//栈为空的话 只能入栈}else{ dfs(in + 1, out - 1);//入栈dfs(in - 1, out);//出栈}
}
int main()
{int n;while (cin >> n){counts = 0;dfs(0, n);cout << counts << endl; }return 0;
}

简洁版代码:

#include<iostream>
using namespace std;
int n;
int ans=0;
void dfs(int index,int sum)
{if(sum==0) ans++;else if(index==0) dfs(index+1,sum-1);else{dfs(index+1,sum-1);dfs(index-1,sum);}
}
int main(void)
{cin>>n;dfs(0,n);cout<<ans<<endl;return 0;
}

问题 F: 【递归入门】走迷宫 【中】


http://codeup.cn/problem.php?cid=100000608&pid=5

#include<iostream>
#include<cstdio>
#include<map>
using namespace std;int n,m;
int start_x,start_y;//起点
int endx,endy;//终点
bool flag=true;
int a[20][20];
bool b[20][20]={false};//记录走过了int dx[4]={0,-1,0,1};//四个方向
int dy[4]={-1,0,1,0};//
pair<int,int> p[300];//保存路径void dfs(int x,int y,int index)// x  y轴坐标  index走了几步
{p[index].first=x;p[index].second=y;if(x==endx&&y==endy)//到终点了{flag=false;int i;for(i=0;i<index;i++){printf("(%d,%d)->",p[i].first,p[i].second);}printf("(%d,%d)\n",p[i].first,p[i].second);return ;}for(int i=0;i<4;i++){int xx=x+dx[i];int yy=y+dy[i];if(a[xx][yy]==1&&!b[xx][yy]){b[xx][yy]=true;dfs(xx,yy,index+1);b[xx][yy]=false;//恢复现场x=xx-dx[i];y=yy-dy[i];}}
}
int main(void)
{cin>>n>>m;for(int i=1;i<=n;i++)for(int j=1;j<=m;j++)scanf("%d",&a[i][j]);cin>>start_x>>start_y;cin>>endx>>endy;b[start_x][start_y]=true;dfs(start_x,start_y,0);if(flag)cout<<-1<<endl;return 0;
}

深度优先搜索(DFS)相关习题相关推荐

  1. 一文搞定深度优先搜索(DFS)与广度优先搜索(BFS)【含完整源码】

    写在前面:博主是一位普普通通的19届双非软工在读生,平时最大的爱好就是听听歌,逛逛B站.博主很喜欢的一句话花开堪折直须折,莫待无花空折枝:博主的理解是头一次为人,就应该做自己想做的事,做自己不后悔的事 ...

  2. C++实现深度优先搜索DFS(附完整源码)

    C++实现深度优先搜索DFS C++实现深度优先搜索DFS完整源码(定义,实现,main函数测试) C++实现深度优先搜索DFS完整源码(定义,实现,main函数测试) #include <al ...

  3. C++用stack实现深度优先搜索DFS(附完整源码)

    C++用stack实现深度优先搜索DFS的实现 C++用stack实现深度优先搜索DFS的完整源码(定义,实现,main函数测试) C++用stack实现深度优先搜索DFS的完整源码(定义,实现,ma ...

  4. 深度优先搜索(DFS) 总结(算法+剪枝+优化总结)

    深度优先搜索(DFS) 总结(算法+剪枝+优化总结) 本文中会引用部分实例.文献资料来自不同的作者之手,由于资料整理比较困难,转载地址不在文中列举.如有侵权请联系我更换或删除!对于提供题解思路的各位大 ...

  5. 【算法很美】深入递归 (下)深度优先搜索DFS问题

    深搜.回溯.剪枝 深度优先搜索DFS 2.1 无死角搜索I 数独游戏 部分和 水洼数目 2.2 回溯和剪枝 n皇后问题 素数环 困难的串 小结 一些使用 2.1 无死角搜索I 数独游戏 你一定听说过& ...

  6. 【算法入门】深度优先搜索(DFS)

    深度优先搜索(DFS) [算法入门] 郭志伟@SYSU:raphealguo(at)qq.com 2012/05/12 1.前言 深度优先搜索(缩写DFS)有点类似广度优先搜索,也是对一个连通图进行遍 ...

  7. 栈和深度优先搜索(DFS)

    与 BFS 类似,深度优先搜索(DFS)是用于在树/图中遍历/搜索的另一种重要算法.也可以在更抽象的场景中使用. 正如树的遍历中所提到的,我们可以用 DFS 进行 前序遍历,中序遍历 和 后序遍历.在 ...

  8. 【蓝桥杯】2015决赛A组 5 穿越雷区(深度优先搜索dfs、广度优先搜索bfs)

    历届试题 穿越雷区 问题描述 X星的坦克战车很奇怪,它必须交替地穿越正能量辐射区和负能量辐射区才能保持正常运转,否则将报废. 某坦克需要从A区到B区去(A,B区本身是安全区,没有正能量或负能量特征), ...

  9. matlab bfs函数,matlab练习程序(广度优先搜索BFS、深度优先搜索DFS)

    如此经典的算法竟一直没有单独的实现过,真是遗憾啊. 广度优先搜索在过去实现的二值图像连通区域标记和prim最小生成树算法时已经无意识的用到了,深度优先搜索倒是没用过. 这次单独的将两个算法实现出来,因 ...

  10. 【数据结构与算法】2.深度优先搜索DFS、广度优先搜索BFS

    原文链接:https://blog.csdn.net/qq_41681241/article/details/81432634 总结 一般来说,广搜常用于找单一的最短路线,或者是规模小的路径搜索,它的 ...

最新文章

  1. python os模块system_python 中 os.system 的本质 | 编程知识2
  2. 关于阅读java编程思想和effective java的一些看法
  3. 这个小姐姐真的很火辣......
  4. VC++ 限制窗口的大小范围的方法
  5. 【word使用技巧】删掉某一行参考
  6. 38. Linux 备份
  7. 编程基本功:要建立测试基准
  8. Windows小技巧 -- Win+R提高Windows使用效率
  9. node.js 代码加密
  10. 密码技术---密钥和SSL/TLS
  11. React移动端端局域网手机访问测试
  12. 支付业务与技术架构学习总结(10)——第三方支付账务系统论述
  13. sql查询时添加一列为固定值
  14. 监控 - Prometheus监控
  15. 编写python程序按照单利方式计算理财产品收益
  16. 【HR必看】Excel中对身份证号码的处理技巧
  17. MSP430 IO操作
  18. NOI Online 2020 Round3 滚粗记
  19. 弘辽科技:京东推广为什么不能加关键词。
  20. java学习日记-接口

热门文章

  1. 修改mysql数据库的编码格式
  2. MaxAlertView 强大的弹框试图
  3. [BZOJ]1503: [NOI2004]郁闷的出纳员
  4. ogre3D学习基础10 -- 键盘控制与鼠标控制(直接控制)
  5. Java中的注解以及应用 @Deprecated @SupressWarning @Override
  6. [转]American Dream 是指什麽
  7. opencv-4.1.0-百度云盘下载链接-环境配置
  8. stm32F103的systick时间不准终于找到原因了
  9. nrf51822-使用16位自定义UUID
  10. BLE简介及连接过程