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\n", cnt);
    return 0;
}

 

你可能感兴趣的:(USACO snail)