zoukankan      html  css  js  c++  java
  • USACO snail

      这个题和传统的走迷宫题非常像, 不同点事这个题选定一个方向后会一直走知道遇到障碍物 走到边缘 或者走到已经走过的点, 我们可以使用dfs来解决这个问题,dfs(x, y, dir, steps)表示从起点到x, y花费的步数, 在搜索的时候把握的一个原则就是每次会走到一个新的格子上。。。代码如下:

    /*
        ID: m1500293
        LANG: C++
        PROG: snail
    */
    #include <cstdio>
    #include <cstring>
    #include <algorithm>
    
    using namespace std;
    int n, b;
    int Map[125][125];
    
    int cnt = 0;
    int dx[] = {0, 0, 1, -1};
    int dy[] = {1, -1, 0, 0};
    bool inside(int x, int y) { return (x>=0&&x<n&&y>=0&&y<n); }
    
    bool vis[125][125];
    void dfs(int x, int y, int dir, int steps)
    {
        if(vis[x][y]) return ;
        cnt = max(cnt, steps);
        vis[x][y] = true;
        int nx=x+dx[dir], ny = y+dy[dir];
        if(!inside(nx, ny) || (inside(nx, ny)&&Map[nx][ny]==1))
        {
            if(dir==0 || dir==1)
            {
                int xx = x+dx[2], yy = y+dy[2];
                if(inside(xx, yy) && Map[xx][yy]==0)
                    dfs(xx, yy, 2, steps+1);
                xx = x+dx[3], yy = y+dy[3];
                if(inside(xx, yy) && Map[xx][yy]==0)
                    dfs(xx, yy, 3, steps+1);
            }
            else if(dir==2 || dir==3)
            {
                int xx = x+dx[0], yy = y+dy[0];
                if(inside(xx, yy) && Map[xx][yy]==0)
                    dfs(xx, yy, 0, steps+1);
                xx = x+dx[1], yy = y+dy[1];
                if(inside(xx, yy) && Map[xx][yy]==0)
                    dfs(xx, yy, 1, steps+1);
            }
        }
        else if(inside(nx, ny) && Map[nx][ny]==0)
            dfs(nx, ny, dir, steps+1);
        vis[x][y] = 0;
    }
    
    int main()
    {
        freopen("snail.in", "r", stdin);
        freopen("snail.out", "w", stdout);
        scanf("%d%d", &n, &b);
        for(int i=0; i<b; i++)
        {
            char s[5];
            scanf("%s", s);
            char c; int a;
            sscanf(s, "%c%d", &c, &a);
            Map[a-1][c-'A'] = 1;
        }
        cnt = 0;
        memset(vis, 0, sizeof(vis));
        dfs(0, 0, 0, 1);
        memset(vis, 0, sizeof(vis));
        dfs(0, 0, 2, 1);
        printf("%d
    ", cnt);
        return 0;
    }
  • 相关阅读:
    编译原理 实例
    lex yacc flex bison
    图解tensorflow 源码分析
    PostgreSQL 179个场景 案例集锦
    github view source
    Java 微服务实践
    Linux kernel AIO
    Lex与Yacc学习
    OpenResty 通过 Lua 扩展 NGINX 实现的可伸缩的 Web 平台
    nginx Architecture
  • 原文地址:https://www.cnblogs.com/xingxing1024/p/5178217.html
Copyright © 2011-2022 走看看