hdu 1484 Basic wall maze bfs + 输出路径
2017-04-10 01:14
357 查看
题意:在6*6的网格中,有三堵墙。输入有5行,前两行是起点和终点,后面三行是墙的描述。求出起点到终点的行走方式,用E,N,S,w表示方位.
思路:用结构体描叙网格,每个网格有6个属性,分别代表4个方位是否可走,以及上一步的坐标,方便打印路径。最短路bfs即可。
思路:用结构体描叙网格,每个网格有6个属性,分别代表4个方位是否可走,以及上一步的坐标,方便打印路径。最短路bfs即可。
#include<cstdio> #include<cstring> #include<queue> using namespace std; const int maxn = 10; char vis[maxn][maxn]; int Move[]={0,1,0,-1,0};//x,y+1 x+1,y x,y-1 x-1,y int si,sj,ei,ej,step; struct node { bool up,down,right,left; int li,lj; }; struct pt { int i,j,li,lj; pt(int i,int j):i(i),j(j){ } }; node map[maxn][maxn]; bool check(int i,int j) { return i>=1&&i<=6&&j>=1&&j<=6; } void bfs() { vis[si][sj]=1; queue<pt> q; map[si][sj].li=map[si][sj].lj=-1; q.push(pt(si,sj)); while(!q.empty()) { int sz = q.size(); while(sz--) { pt a=q.front();q.pop(); int di=a.i;int dj=a.j; if(di==ei&&dj==ej) { int cnt=0;char c[64]; c[cnt++]=vis[ei][ej]; int curi=map[ei][ej].li,curj=map[ei][ej].lj; while(curi!=si||curj!=sj) { c[cnt++]=vis[curi][curj]; int ki,kj; ki=map[curi][curj].li;kj=map[curi][curj].lj; curi=ki;curj=kj; } for(int i=cnt-1;i>=0;i--) printf("%c",c[i]); printf("\n"); return; } for(int i=0;i<4;i++) { int ci=di+Move[i]; int cj=dj+Move[i+1]; if(check(ci,cj)) { if(vis[ci][cj]==0&&Move[i]==1&&map[di][dj].down!=1) { q.push(pt(ci,cj)); map[ci][cj].li=di; map[ci][cj].lj=dj; vis[ci][cj]='S'; } if(vis[ci][cj]==0&&Move[i]==-1&&map[di][dj].up!=1) { q.push(pt(ci,cj)); map[ci][cj].li=di; map[ci][cj].lj=dj; vis[ci][cj]='N'; } if(vis[ci][cj]==0&&Move[i+1]==1&&map[di][dj].right!=1) { q.push(pt(ci,cj)); map[ci][cj].li=di; map[ci][cj].lj=dj; vis[ci][cj]='E'; } if(vis[ci][cj]==0&&Move[i+1]==-1&&map[di][dj].left!=1) { q.push(pt(ci,cj)); map[ci][cj].li=di; map[ci][cj].lj=dj; vis[ci][cj]='W'; } } } } } } int main() { while(scanf("%d%d",&sj,&si)&&(si+sj)) { scanf("%d%d",&ej,&ei); int x1,y1,x2,y2; memset(vis,0,sizeof(vis)); for(int i=1;i<=6;i++) { for(int j=1;j<=6;j++) { map[i][j].down=map[i][j].left =map[i][j].right=map[i][j].up=0; } } for(int i=0;i<3;i++) { scanf("%d%d%d%d",&x1,&y1,&x2,&y2); if(x1==x2) { int m1 = y1>y2?y1:y2; int m2 = y1>y2?y2:y1; for(int i=m2+1;i<=m1;i++) { map[i][x1].right=1; 4000 map[i][x1+1].left=1; } } else if(y1==y2) { int m1 = x1>x2?x1:x2; int m2 = x1>x2?x2:x1; for(int i=m2+1;i<=m1;i++) { map[y1][i].down=1; map[y1+1][i].up=1; } } } bfs(); } }
相关文章推荐
- HDU 1484 Basic wall maze
- HDU 1484 Basic wall maze (dfs + 记忆)
- HDU 1484 Basic wall maze (dfs + 记忆化)
- POJ2935 Basic Wall Maze(BFS)
- 【HDOJ】1484 Basic wall maze
- poj 2935 Basic Wall Maze bfs
- Basic Wall Maze_条件bfs_2018_2_23
- hdu 1026 Ignatius and the Princess I(bfs搜索+输出路径)
- POJ 2935 Basic Wall Maze (BFS)
- 22 poj2935 Basic Wall Maze --- bfs
- hdu 1026 Ignatius and the Princess I(简单的bfs+输出路径)(WA的代码)
- (BFS)poj2935-Basic Wall Maze
- hdu 1026 bfs(数组模拟,路径输出)
- Hdu 1026 Ignatius and the Princess I (BFS 优先队列+路径输出)
- HDU 1026 Ignatius and the Princess I (BFS输出路径)
- poj 2935 Basic Wall Maze bfs
- hdu1430 魔板(双向bfs+输出路径+字典序最小)
- hdu 1385(求出最短路并输出最短路径)
- poj2935 Basic Wall Maze
- poj 3984 迷宫问题(BFS+输出路径)