文章标题
来源:互联网 发布:人力资源软件排名2016 编辑:程序博客网 时间:2024/06/07 10:18
深度优先搜索(DFS)题集
经典题目①
♥下山♥:
Time Limit: 1000 MS Memory Limit: 65536 K
Description
下面的矩阵可以想象成鸟瞰一座山,矩阵内的数据可以想象成山的高度。可以从任意一点开始下山。每一步的都可以朝“上下左右”4个方向行走,前提是下一步所在的点比当前所在点的数值小。例如处在18这个点上,可以向上、向左移动,而不能向右,向下移动。
1 2 3 4 5
16 17 18 19 6
15 24 25 20 7
14 23 22 21 8
13 12 11 10 9
请计算出最长的下山路径。对于上面的矩阵,最长路径为25-24-23-22-21-20-19-18-17-16-15-14-13-12-11-10-9-8-7-6-5-4-3-2-1,应输出结果25。
Input
+ 输入包括多组测试用例。
+ 对于每个用例,第一行包含两个正整数R和C分别代表矩阵的行数和列数。(1 <= R,C <= 100)
+ 从第二行开始是一个R行C列矩阵,每点的数值在[0,10000]内。
Output
输出最长的下山路径的长度。
Sample Input
5 5
1 2 3 4 5
16 17 18 19 6
15 24 25 20 7
14 23 22 21 8
13 12 11 10 9
Sample Output
25
分析
代码
#include<iostream>using namespace std;const int N=100;int a[N][N],used[N][N],n,m;int dfs(int i,int j){ if(used[i][j]) return used[i][j]; int max = 0; if(i-1>=0&&a[i][j]>a[i-1][j]) max = dfs(i-1,j); if(i+1<n&&a[i][j]>a[i+1][j]&&max<dfs(i+1,j)) max = dfs(i+1,j); if(j-1>=0&&a[i][j]>a[i][j-1]&&max<dfs(i,j-1)) max = dfs(i,j-1); if(j+1<m&&a[i][j]>a[i][j+1]&&max<dfs(i,j+1)) max = dfs(i,j+1); return used[i][j] = max + 1;}int main(){ while(cin>>n>>m){ for(int i=0;i<n;i++) for(int j=0;j<m;j++){ cin>>a[i][j]; used[i][j] = 0; } int max = 0; for(int i=0;i<n;i++) for(int j=0;j<m;j++) max = max < dfs(i,j) ? dfs(i,j) : max; cout<<max<<endl; }}
另一种写法♣
#include <stdio.h>#include <string.h>int Max,r,c;int a[110][110];int st[110][110];int dx[4] = {0,1,0,-1};int dy[4] = {1,0,-1,0};bool judge(int x,int y,int h){ if(x<1 || x>r || y<1 || y>c) //越界 return true; if(a[x][y]>=h) //如果下一步的山比当前这一步的要高,则不能走 return true; return false;}void dfs(int x,int y,int s){ int i; if(s>Max) Max = s; for(i=0;i<4;i++){ //遍历四个方向 int nx = x + dx[i]; int ny = y + dy[i]; if(judge(nx,ny,a[x][y])) continue; if(s+1 > st[nx][ny]) //剪枝,如果走这一步没有之前存储的走的路径长,则不能走这一步 st[nx][ny] = s+1; else continue; dfs(nx,ny,s+1); }}int main(){ int i,j; while(scanf("%d%d",&r,&c)!=EOF){ memset(st,0,sizeof(st)); Max = 0; for(i=1;i<=r;i++) //输入 for(j=1;j<=c;j++) scanf("%d",&a[i][j]); for(i=1;i<=r;i++) //遍历 for(j=1;j<=c;j++) dfs(i,j,1); printf("%d\n",Max); } return 0;}
乱入一个链接:回溯的博客
牛逼
经典题目②
♥八皇后♥:
阅读全文
0 0
- 文章标题文章标题文章标题文章标题文章标题文章标题文章标题文章标题文章标题文章标题文章标题文章标题文章标题文章标题文章标题文章标题文章标题
- 文章标题
- 文章标题
- 文章标题
- 文章标题 文章标题 文章标题 文章标题
- 文章标题
- 文章标题
- 文章标题
- 文章标题
- 文章标题
- 文章标题
- 文章标题
- 文章标题
- 文章标题
- 文章标题
- 文章标题
- 文章标题
- 文章标题
- Altium Designer飞线(未连接线)不显示的解决方法
- mac终端添加ll、la、l命令
- Insert at the front of a linked list
- spark学习-43-Spark的BlockManager
- Java高效读取大文件
- 文章标题
- Java数据类型分析
- jq弹窗,开源
- 前端跨域,nginx反向代理的解决方案
- C语言第一讲
- 用 TensorFlow 追踪千年隼号
- eclipse启动服务+tomcat运行报java.lang.OutOfMemoryError: PermGen space
- CentOS7上解决tomcat不能被外部浏览访问的问题
- Instruments-Leaks 不显示方法的问题