https://www.luogu.org/problem/P1086
#include <bits/stdc++.h> using namespace std; typedef long long ll; int m,n,k,ans=0; int a[25][25]; void dfs(int x,int y,int time) { int Max=-(1<<30),nx,ny; //Max最大的花生点,nx最大花生点的x坐标 ,ny最大花生点的y坐标 for(int i=1; i<=m; i++) for(int j=1; j<=n; j++) if(a[i][j]>Max) { Max=a[i][j]; nx=i; ny=j;//更新 } if(y==0) //如果从路边开始, y=ny;//则只需要移动的行的数目 int nt=abs(nx-x)+abs(ny-y)+nx+1; //到达花生,采摘,nx表示并返回边界,1表示采摘花生 if(time<nt || a[nx][ny]==0) //如果剩余的时间少于nt或者已经被采摘过 return; else { ans+=a[nx][ny]; //累加 a[nx][ny]=0; //清零 dfs(nx,ny,time-abs(nx-x)-abs(ny-y)-1); //进行下一次 } } int main() { scanf("%d %d %d",&m,&n,&k); for(int i=1; i<=m; i++) for(int j=1; j<=n; j++) scanf("%d",&a[i][j]); dfs(0,0,k); printf("%d\n",ans); return 0; }