花生采摘(dfs)

[NOIP2004]花生采摘

https://ac.nowcoder.com/acm/problem/16659

链接:https://ac.nowcoder.com/acm/problem/16659 来源:牛客网

题目描述 鲁宾逊先生有一只宠物猴,名叫多多。这天,他们两个正沿着乡间小路散步,突然发现路边的告示牌上贴着一张小小的纸条:“欢迎免费品尝我种的花生!——熊字”。

鲁宾逊先生和多多都很开心,因为花生正是他们的最爱。在告示牌背后,路边真的有一块花生田,花生植株整齐地排列成矩形网格(如图1)。有经验的多多一眼就能看出,每棵花生植株下的花生有多少。为了训练多多的算术,鲁宾逊先生说:“你先找出花生最多的植株,去采摘它的花生;然后再找出剩下的植株里花生最多的,去采摘它的花生;依此类推,不过你一定要在我限定的时间内回到路边。” 输出描述: 包括一行,这一行只包含一个整数,即在限定时间内,多多最多可以采到花生的个数。 示例1

输入

6 7 21

  • 0 0 0 0 0 0 0
  • 0 0 0 0 13 0 0
  • 0 0 0 0 0 0 7
  • 0 15 0 0 0 0 0
  • 0 0 0 9 0 0 0
  • 0 0 0 0 0 0 0 输出 37 示例2

输入

6 7 20

  • 0 0 0 0 0 0 0
  • 0 0 0 0 13 0 0
  • 0 0 0 0 0 0 7
  • 0 15 0 0 0 0 0
  • 0 0 0 9 0 0 0
  • 0 0 0 0 0 0 0

输出 28

输入描述: 输入第一行包括三个整数,M, N和K,用空格隔开;表示花生田的大小为M * N(1 <= M, N<= 20),多多采花生的限定时间为K(0 <= K <= 1000)个单位时间。

接下来的M行,每行包括N个非负整数,也用空格隔开;第i + 1行的第j个整数Pij(0 <= Pij <= 500)表示花生田里植株(i,j)下花生的数目,0表示该植株下没有花生。

这里采用了递归

#include <bits/stdc++.h>
using namespace std;
const int N = 410;
int n,m,t;
struct point{           //用来记录每个不为0的格子所在的位置和value
    int x,y,val;
}arr[N];
bool cmp(point a ,point b)
{
    return a.val > b.val;//根据value来进行排序
}
void  dfs(int dep,int cnt,int count ,int T)
{
    if(dep == cnt + 1) {
        cout << count;
        return;
    };
    int nowT = T + abs(arr[dep].x - arr[dep - 1].x) + abs(arr[dep].y - arr[dep - 1].y) +arr[dep].x + 1;
//    cout << nowT << endl;
    if(nowT > t) {//判断是否能走到下一个最大值那里去,如果不能直接输出然后退出。
        cout << count ;
        return;
    }
    else {//如果能的话,我们进行下一层的搜索。
        dfs(dep + 1, cnt, count + arr[dep].val, nowT - arr[dep].x);
    }
}
int main ()
{
    cin >> n >> m >> t;
    int cnt = 0;
    for(int i = 1;i <= n;i++)
    {
        for(int j = 1;j <= m;j++)
        {
            int value;
            cin >> value;
            if(value){
               arr[++cnt].x = i;
               arr[cnt].y = j;
               arr[cnt].val = value;
            }
        }
    }
    sort(arr + 1,arr + cnt + 1,cmp);
//    for(int i = 1; i <= cnt;i ++)  cout << arr[i].x << " " << arr[i].y << " " << arr[i].val << endl;
    int count = 0; int T = 0;//因为第一个和往后的是不一样的,需要进行特判,所以就先拿出来。
    if(arr[1].x * 2 + 1 > t){
        cout << 0;
        return 0;
    }
    else{
        T += arr[1].x + 1;
//         cout << T << endl;
        count += arr[1].val;
    }
    dfs(2,cnt,count,T);//然后是从第二个进行的搜索。
    return 0;
}
全部评论

相关推荐

02-22 21:16
已编辑
门头沟学院 运营
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客企业服务