嗯...
题目链接:https://www.luogu.org/problemnew/show/P1086
这道题首先主要的思想就是贪心:
每次寻找花生田中价值最大的花生,然后通过一种类似dfs的方法来判断这株花生能否摘。
如果不能摘,则return;如果能摘,则ans+,且将时间扣除。
注意:
1.这个题的细节比较多,尤其是在是否能摘花生时关于时间的细节比较多。其余细节在代码中已解释。
2.弄清横纵坐标问题,x在这里表示行,y表示列。
AC代码:
1 #include<cstdio> 2 #include<iostream> 3 #include<cmath> 4 5 using namespace std; 6 7 int g[21][21], n, m, k, ans; 8 9 inline void dfs(int t, int x, int y){ 10 int maxx, maxy, maxn = -1; 11 for(int i = 1; i <= m; i++){ 12 for(int j = 1; j <= n; j++){ 13 if(g[i][j] > maxn){ 14 maxn = g[i][j]; 15 maxx = i; 16 maxy = j; 17 } 18 } 19 } 20 if(!y) y = maxy;//如果在路边,跳到maxy 21 if(t < abs(x - maxx) + abs(y - maxy) + maxx + 1 || !g[maxx][maxy]) return; 22 //若时间<采(Maxx,Maxy)的时间+回到路边的时间或是(Maxx,Maxy)上没有花生,就结束 23 //注意+1,回到路边还需要1单位时间 24 else{ 25 ans += g[maxx][maxy]; 26 g[maxx][maxy] = 0; 27 dfs(t - abs(x - maxx) - abs(y - maxy) - 1, maxx, maxy);//继续 28 }//采摘 29 } 30 31 int main(){ 32 scanf("%d%d%d", &m, &n, &k); 33 for(int i = 1; i <= m; i++){ 34 for(int j = 1; j <= n; j++){ 35 scanf("%d", &g[i][j]); 36 } 37 } 38 dfs(k, 0, 0); 39 printf("%d\n", ans); 40 return 0; 41 }