zju 1107

来源:互联网 发布:log4j2 数据库 编辑:程序博客网 时间:2024/06/16 21:38

       题目意思是给定一幅图,老鼠只能前后左右移动且最多移动k个格子(不一定在同一行或同一列,但不这样考虑也可以过。。。。),每个格子均有一定权值的食物,问从起点(0,0)开始出发的老鼠,怎么走可以获得权值最大的食物,同时要求下一个到达的格子的食物权值大于当前格子的。

       和poj的滑雪一题几乎一致,解题方法自然也是记忆化搜索。

        代码很简单:

 

      

#include<cstdio>#include<cstring>#include<iostream>#include<utility>#include<string>#include<set>#include<vector>#include<stack>#include<algorithm>#include<queue>#include<cstdlib>#include<cmath>using namespace std;const int N=200;int map[N][N];int vis[N][N];int dir[4][2]={0,1,0,-1,-1,0,1,0};int n,k;void init(){for(int i=0;i<n;i++){for(int j=0;j<n;j++){scanf("%d",&map[i][j]);vis[i][j]=0;}}}bool check(int x,int y){if(0<=x && x<n && 0<=y && y<n)return true;elsereturn false;}int dfs(int x,int y){if(vis[x][y]!=0) return vis[x][y];int max=0;for(int i=1;i<=k;i++){for(int j=1;j<=k;j++){for(int t=0;t<4;t++){int x1=x+i*dir[t][0];int y1=y+j*dir[t][1];if(check(x1,y1) && map[x][y]<map[x1][y1]){vis[x1][y1]=dfs(x1,y1);if(vis[x1][y1]>max) max=vis[x1][y1];}}}}return map[x][y]+max;}int main(){while(scanf("%d%d",&n,&k)==2){if(n==-1 && k==-1) break;init();printf("%d\n",dfs(0,0));}return 0;}


 

原创粉丝点击