poj 3083 Children of the Candy Corn
2012-02-29 22:04
573 查看
http://poj.org/problem?id=3083
题意:迷宫问题,求从进入点到出口,分别按靠左边,右边和最短距离到达出口所学要的步数;
思路:用dfs求得靠左靠右走到达出口的步数,用bfs求最短最少到达出口的步数;
代码:
View Code
题意:迷宫问题,求从进入点到出口,分别按靠左边,右边和最短距离到达出口所学要的步数;
思路:用dfs求得靠左靠右走到达出口的步数,用bfs求最短最少到达出口的步数;
代码:
View Code
#include <cstdio> #include <iostream> #include <algorithm> #include <cstring> #include <cstdlib> #include <queue> using namespace std; int xx[6] = {0,1,0,-1,0}; int yy[6] = {0,0,-1,0,1}; int w = 0; int h = 0; int xs = 0; int ys = 0; int xe = 0; int ye = 0; int l = 0; int r = 0; int mi = 0; char map[45][45] = {NULL}; int s[45][45] = {0}; bool visit[45][45] = {0}; int foward = 0; int ll(int i) { int te = (i+1)%4; if(te == 0) te = 4; return te; } int rr(int i) { int te = (i-1)%4; if(te == 0) te = 4; return te; } void dfsl(int x,int y,int step,int fow) { int te = ll(fow); if(x == xe && y == ye) { l = step; return ; } if(s[x+xx[te]][y+yy[te]]) dfsl(x+xx[te],y+yy[te],step+1,te); else if(s[x+xx[fow]][y+yy[fow]]) dfsl(x+xx[fow],y+yy[fow],step+1,fow); else { te = rr(fow); if(s[x+xx[te]][y+yy[te]]) dfsl(x+xx[te],y+yy[te],step+1,te); else { te = (fow+2)%4; if(te == 0) te = 4; dfsl(x+xx[te],y+yy[te],step+1,te); } } } void dfsr(int x,int y,int step,int fow) { int te = rr(fow); if(x == xe && y == ye) { r = step; return ; } if(s[x+xx[te]][y+yy[te]]) dfsr(x+xx[te],y+yy[te],step+1,te); else if(s[x+xx[fow]][y+yy[fow]]) dfsr(x+xx[fow],y+yy[fow],step+1,fow); else { te = ll(fow); if(s[x+xx[te]][y+yy[te]]) dfsr(x+xx[te],y+yy[te],step+1,te); else { te = (fow+2)%4; if(te == 0) te = 4; dfsr(x+xx[te],y+yy[te],step+1,te); } } } void bfs(int x,int y,int step,int fow) { queue<int>x3; queue<int>y3; queue<int>ste; queue<int>fo; x3.push(x); y3.push(y); ste.push(step); fo.push(fow); visit[x][y] = 1; while(!x3.empty()) { x = x3.front(); y = y3.front(); step = ste.front(); fow = fo.front(); x3.pop(); y3.pop(); ste.pop(); fo.pop(); if(x == xe&&y == ye) { mi =step; return ; } mi = step; int te; te = rr(fow); if(!visit[x+xx[te]][y+yy[te]]&&s[x+xx[te]][y+yy[te]]) { visit[x+xx[te]][y+yy[te]] = 1; x3.push(x+xx[te]); y3.push(y+yy[te]); ste.push(step+1); fo.push(te); } if(!visit[x+xx[fow]][y+yy[fow]]&&s[x+xx[fow]][y+yy[fow]]) { visit[x+xx[fow]][y+yy[fow]] = 1; x3.push(x+xx[fow]); y3.push(y+yy[fow]); ste.push(step+1); fo.push(fow); } te = ll(fow); if(!visit[x+xx[te]][y+yy[te]]&&s[x+xx[te]][y+yy[te]]) { visit[x+xx[te]][y+yy[te]] = 1; x3.push(x+xx[te]); y3.push(y+yy[te]); ste.push(step+1); fo.push(te); } } } int main() { int num = 0; scanf("%d",&num); while(num--) { memset(s,0,sizeof(s)); memset(visit,0,sizeof(visit)); scanf("%d%d",&w,&h); getchar(); for(int i = h-1;i >= 0; --i) { scanf("%s",map[i]); } for(int i = 0;i < h; ++i) for(int j = 0;j < w; ++j) if(map[i][j] != '#') { s[i][j] = 1; if(map[i][j] == 'S') { xs = i; ys = j; } if(map[i][j] == 'E') { xe = i; ye = j; } } if(xs == 0) foward = 1; if(xs == h-1) foward = 3; if(ys == 0) foward = 4; if(ys == w-1) foward = 2; dfsl(xs,ys,1,foward); dfsr(xs,ys,1,foward); bfs(xs,ys,1,foward); printf("%d %d %d\n",l,r,mi); } return 0; }
相关文章推荐
- POJ 3083 Children of the Candy Corn (BFS+顺时针逆时针DFS)
- poj 3083 Children of the Candy Corn(搜索)
- Children of the Candy Corn(POJ--3083
- poj 3083 Children of the Candy Corn
- POJ 3083 Children of the Candy Corn(bfs+dfs)
- poj-3083 Children of the Candy Corn
- Children of the Candy Corn( POJ 3083)
- POJ-3083 Children of the Candy Corn
- POJ 3083 Children of the Candy Corn
- poj 3083 Children of the Candy Corn(dfs+bfs)
- poj 3083 -- Children of the Candy Corn (走迷宫)
- POJ 3083 Children of the Candy Corn (BFS+顺时针逆时针DFS)
- POJ 3083:Children of the Candy Corn
- POJ 3083 Children of the Candy Corn
- POJ 3083:Children of the Candy Corn(DFS+BFS)
- POJ 3083 Children of the Candy Corn
- POJ3083-Children of the Candy Corn(bfs+dfs)
- poj 3083 Children of the Candy Corn (广搜,模拟,简单)
- POJ 3083_Children of the Candy Corn
- POJ 3083:Children of the Candy Corn