文章标题

来源:互联网 发布:人力资源软件排名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;}

乱入一个链接:回溯的博客

牛逼


经典题目②

♥八皇后♥:

原创粉丝点击