HDU 1180 诡异的楼梯
2013-07-22 15:00
393 查看
链接:点击打开链接
题意:题意应该很好理解,就是从S到T的最少步数,只是加了一个楼梯。
思路:一看就是广搜,找最少的步数,Harry只能每次走到相邻的格子而不能斜走,每移动一次恰好为一分钟,并且Harry登上楼梯并经过楼梯到达对面的整个过程只需要一分钟,Harry从来不在楼梯上停留.并且每次楼梯都恰好在Harry移动完毕以后才改变方向.所以每次走到楼梯时特判一下,遵循奇变偶不变的原则,可以走过去,就只花一分钟,不能走过去,则花两分钟。除了楼梯,每次走过的点被标记。一遍BFS就能得出答案。
这是自己的,有点麻烦:
这是我根据上面改的:
题意:题意应该很好理解,就是从S到T的最少步数,只是加了一个楼梯。
思路:一看就是广搜,找最少的步数,Harry只能每次走到相邻的格子而不能斜走,每移动一次恰好为一分钟,并且Harry登上楼梯并经过楼梯到达对面的整个过程只需要一分钟,Harry从来不在楼梯上停留.并且每次楼梯都恰好在Harry移动完毕以后才改变方向.所以每次走到楼梯时特判一下,遵循奇变偶不变的原则,可以走过去,就只花一分钟,不能走过去,则花两分钟。除了楼梯,每次走过的点被标记。一遍BFS就能得出答案。
这是自己的,有点麻烦:
#include<iostream> #include<cstdio> #include<cstring> #include<queue> using namespace std; struct node{ int x; int y; int count; }; int n,m,fx,fy,ex,ey; int dx[4]={-1,1,0,0}; int dy[4]={0,0,-1,1}; bool vis[30][30]; char str[30][30]; void bfs(){ int i; queue<node>Q; node p,q; p.x=fx; p.y=fy; p.count=0; vis[p.x][p.y]=true; Q.push(p); while(!Q.empty()){ p=Q.front(); Q.pop(); if(p.x==ex&&p.y==ey){ printf("%d\n",p.count); return; } if(p.x<1||p.x>n||p.y<1||p.y>m) continue; for(i=0;i<4;i++){ q=p; q.x=p.x+dx[i]; q.y=p.y+dy[i]; if(str[q.x][q.y]=='|'){ if(q.x==p.x&&q.count%2!=0){ q.y=q.y+dy[i]; q.count=p.count+1; if(str[q.x][q.y]=='.'&&!vis[q.x][q.y]){ vis[q.x][q.y]=true; Q.push(q);} } else if(q.x==p.x&&q.count%2==0){ q.y=q.y+dy[i]; q.count=p.count+2; if(str[q.x][q.y]=='.'&&!vis[q.x][q.y]){ vis[q.x][q.y]=true; Q.push(q); } } else if(q.y==p.y&&q.count%2==0){ q.x=q.x+dx[i]; q.count=p.count+1; if(str[q.x][q.y]=='.'&&!vis[q.x][q.y]){ vis[q.x][q.y]=true; Q.push(q); } } else if(q.y==p.y&&q.count%2!=0){ q.x=q.x+dx[i]; q.count=p.count+2; if(str[q.x][q.y]=='.'&&!vis[q.x][q.y]){ vis[q.x][q.y]=true; Q.push(q); } } } else if(str[q.x][q.y]=='-'){ if(q.x==p.x&&q.count%2==0){ q.y=q.y+dy[i]; q.count=p.count+1; if(str[q.x][q.y]=='.'&&!vis[q.x][q.y]){ vis[q.x][q.y]=true; Q.push(q); } } else if(q.x==p.x&&q.count%2!=0){ q.y=q.y+dy[i]; q.count=p.count+2; if(str[q.x][q.y]=='.'&&!vis[q.x][q.y]){ vis[q.x][q.y]=true; Q.push(q); } } else if(q.y==p.y&&q.count%2!=0){ q.x=q.x+dx[i]; q.count=p.count+1; if(str[q.x][q.y]=='.'&&!vis[q.x][q.y]){ vis[q.x][q.y]=true; Q.push(q);} } else if(q.y==p.y&&q.count%2==0){ q.x=q.x+dx[i]; q.count=p.count+2; if(str[q.x][q.y]=='.'&&!vis[q.x][q.y]){ vis[q.x][q.y]=true; Q.push(q); } } } else if(str[q.x][q.y]=='.'&&!vis[q.x][q.y]){ q.count=p.count+1; vis[q.x][q.y]=true; Q.push(q); } } } } int main(){ int i,j; while(~scanf("%d %d",&n,&m)){ for(i=1;i<=n;i++){ getchar(); for(j=1;j<=m;j++){ scanf("%c",&str[i][j]); if(str[i][j]=='S'){ fx=i; fy=j; } else if(str[i][j]=='T'){ ex=i; ey=j; str[i][j]='.'; } } } memset(vis,false,sizeof(vis)); bfs(); } return 0; }这是别人AC代码,但是又错误,卡数据过的,考虑不完全,当时一直在想那个加2是怎么来的:
#include<iostream> #include<cstdio> #include<cstring> #include<queue> using namespace std; struct node{ int x; int y; int count; }; int n,m,fx,fy,ex,ey; int dx[4]={-1,1,0,0}; int dy[4]={0,0,-1,1}; bool vis[30][30]; char str[30][30]; void bfs(){ int i; queue<node>Q; while(!Q.empty()) Q.pop(); node p,q; p.x=fx; p.y=fy; p.count=0; Q.push(p); vis[p.x][p.y]=true; while(!Q.empty()){ p=Q.front(); Q.pop(); if(p.x<1||p.x>n||p.y<1||p.y>m) continue; if(p.x==ex&&p.y==ey){ printf("%d\n",p.count); return; } for(i=0;i<4;i++){ //q=p; q.x=p.x+dx[i]; q.y=p.y+dy[i]; if(!vis[q.x][q.y]&&str[q.x][q.y]!='*'){ if(str[q.x][q.y]=='.'){ q.count=p.count+1; Q.push(q); vis[q.x][q.y]=true; } if(str[q.x][q.y]=='-'&&(p.count%2)==0||str[q.x][q.y]=='|'&&(p.count%2)==1){ if(q.x==p.x){ q.y=q.y+dy[i]; q.count=p.count+1; if(!vis[q.x][q.y]&&str[q.x][q.y]=='.'){ Q.push(q); vis[q.x][q.y]=true; } } else { q.x=q.x+dx[i]; q.count=p.count+1; Q.push(q); } } if(str[q.x][q.y]=='|'&&(p.count%2)==0||str[q.x][q.y]=='-'&&(p.count%2)==1){ if(q.y==p.y){ q.x=q.x+dx[i]; q.count=p.count+1; if(!vis[q.x][q.y]&&str[q.x][q.y]=='.'){ vis[q.x][q.y]=true; Q.push(q); } } else { q.y=q.y+dy[i]; q.count=p.count+2; Q.push(q); } } } } } // printf("0\n"); } int main(){ int i,j; while(~scanf("%d %d",&n,&m)){ //if(n==0&&m==0) // break; for(i=1;i<=n;i++){ getchar(); for(j=1;j<=m;j++){ scanf("%c",&str[i][j]); if(str[i][j]=='S'){ fx=i; fy=j; } else if(str[i][j]=='T'){ ex=i; ey=j; str[i][j]='.'; } } } memset(vis,false,sizeof(vis)); bfs(); } return 0; }
这是我根据上面改的:
#include<iostream> #include<cstdio> #include<cstring> #include<queue> using namespace std; struct node{ int x; int y; int count; }; int n,m,fx,fy,ex,ey; int dx[4]={-1,1,0,0}; int dy[4]={0,0,-1,1}; bool vis[30][30]; char str[30][30]; void bfs(){ int i; queue<node>Q; while(!Q.empty()) Q.pop(); node p,q; p.x=fx; p.y=fy; p.count=0; Q.push(p); vis[p.x][p.y]=true; while(!Q.empty()){ p=Q.front(); Q.pop(); if(p.x<1||p.x>n||p.y<1||p.y>m) continue; if(p.x==ex&&p.y==ey){ printf("%d\n",p.count); return; } for(i=0;i<4;i++){ //q=p; q.x=p.x+dx[i]; q.y=p.y+dy[i]; if(!vis[q.x][q.y]&&str[q.x][q.y]!='*'){ if(str[q.x][q.y]=='.'){ q.count=p.count+1; Q.push(q); vis[q.x][q.y]=true; } if(str[q.x][q.y]=='-'&&(p.count%2)==0||str[q.x][q.y]=='|'&&(p.count%2)==1){ if(q.x==p.x){ q.y=q.y+dy[i]; q.count=p.count+1; if(!vis[q.x][q.y]&&str[q.x][q.y]=='.'){ Q.push(q); vis[q.x][q.y]=true; } } else { q.x=q.x+dx[i]; q.count=p.count+2; if(str[q.x][q.y]=='.'&&!vis[q.x][q.y]){ Q.push(q); vis[q.x][q.y]=true; } } } if(str[q.x][q.y]=='|'&&(p.count%2)==0||str[q.x][q.y]=='-'&&(p.count%2)==1){ if(q.y==p.y){ q.x=q.x+dx[i]; q.count=p.count+1; if(!vis[q.x][q.y]&&str[q.x][q.y]=='.'){ vis[q.x][q.y]=true; Q.push(q); } } else { q.y=q.y+dy[i]; q.count=p.count+2; if(str[q.x][q.y]=='.'&&!vis[q.x][q.y]){ Q.push(q); vis[q.x][q.y]=true; } } } } } } // printf("0\n"); } int main(){ int i,j; while(~scanf("%d %d",&n,&m)){ //if(n==0&&m==0) // break; for(i=1;i<=n;i++){ getchar(); for(j=1;j<=m;j++){ scanf("%c",&str[i][j]); if(str[i][j]=='S'){ fx=i; fy=j; } else if(str[i][j]=='T'){ ex=i; ey=j; str[i][j]='.'; } } } memset(vis,false,sizeof(vis)); bfs(); } return 0; }
相关文章推荐
- HDU 1180 诡异的楼梯 BFS
- hdu1180诡异的楼梯(bfs)
- HDU 1180 诡异的楼梯
- HDU 1180-诡异的楼梯
- 【Bfs】HDU 1180 诡异的楼梯
- hdu 1180 诡异的楼梯(bfs+最短路+dp)
- hdu1180诡异的楼梯(广搜)
- hdu1180——诡异的楼梯(优先队列+bfs)
- HDU 1180 诡异的楼梯
- HDU 1180 诡异的楼梯【广搜】
- HDU 1180 诡异的楼梯 bfs
- HDU 1180 诡异的楼梯
- hdu 1180 诡异的楼梯 (bfs)
- hdu 1180 诡异的楼梯
- hdu 1180 诡异的楼梯
- hdu 1180 诡异的楼梯 (bfs)
- hdu1180——诡异的楼梯
- 诡异的楼梯 HDU - 1180
- HDU-1180 诡异的楼梯(BFS)
- HDU-1180-诡异的楼梯