这是一道记忆化搜索,也就是有记录的搜索。
注意点:一次走k步不能拐弯
int bfs(int x,int y) { int mm=0; if(ans[x][y]>=0) return ans[x][y]; for(int i=0;i<4;i++) { for(int j=1;j<=k;j++) { int tx=x+j*dx[i]; int ty=y+j*dy[i]; if(!in(tx,ty)||g[tx][ty]<=g[x][y]) continue; int res=bfs(tx,ty); mm=max(res,mm); } } return ans[x][y]=mm+g[x][y]; }
递归返回,这个写法要多多注意。
#include<cstdio> #include<algorithm> #include<cmath> #include<map> #include<iostream> #include<cstring> #include<queue> #include<vector> using namespace std; #define LL long long int n,k; int g[105][105]; int ans[105][105]; int dx[4]={-1,1,0,0}; int dy[4]={0,0,-1,1}; bool in(int x,int y) { if(x>=0&&x<n&&y>=0&&y<n) return 1; return 0; } int bfs(int x,int y) { int mm=0; if(ans[x][y]>=0) return ans[x][y]; for(int i=0;i<4;i++) { for(int j=1;j<=k;j++) { int tx=x+j*dx[i]; int ty=y+j*dy[i]; if(!in(tx,ty)||g[tx][ty]<=g[x][y]) continue; int res=bfs(tx,ty); mm=max(res,mm); } } return ans[x][y]=mm+g[x][y]; } int main() { //freopen("input.txt","r",stdin); while(scanf("%d%d",&n,&k)==2) { if(n==-1) break; for(int i=0;i<n;i++) for(int j=0;j<n;j++) { scanf("%d",&g[i][j]); } memset(ans,-1,sizeof(ans)); int f=bfs(0,0); printf("%d\n",f); } }