zoukankan      html  css  js  c++  java
  • zoj1107 FatMouse and Cheese

    这是一道记忆化搜索,也就是有记录的搜索。

    注意点:一次走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
    ",f);
        }
    }
  • 相关阅读:
    Cooperate with Myself
    A brief introduction of myself
    计算1+11+111+1111+........
    Jav实现F(n)=F(n-1)+F(n-2)+.....+F(1)+1
    查找二维数组中是否有符合的目标值
    排序算法
    时间复杂度
    Java代码实现单例模式
    查找一个字符串中重复出现字符的个数
    null,“”,empty的区别
  • 原文地址:https://www.cnblogs.com/acliang/p/4897675.html
Copyright © 2011-2022 走看看