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; }