当前位置:编程学习 > C/C++ >>

hdu 1180诡异的楼梯(bfs)

时间数组标记是否将遇到的位置进队列即可,应该用优先队列也是可以的,不过麻烦。
 
#include <iostream>  
#include <queue>  
#include <cstring>  
using namespace std;  
struct point  
{  
    int x,y,step;  
}s,e;  
queue<point> q;  
int n,m,tim[25][25];  
char map[25][25];  
int h[4][2]={1,0,-1,0,0,1,0,-1};  
int BFS()  
{  
    while(!q.empty()) q.pop();  
    int i,j,xx,yy,shu; point t,tt;  
    q.push(s);tim[s.x][s.y]=0;  
    while(!q.empty())  
    {  
        t=q.front(); q.pop();  
        for(i=0;i<4;i++)  
        {  
            xx=t.x+h[i][0]; yy=t.y+h[i][1];  
            if(xx>=0&&xx<n&&yy>=0&&yy<m&&map[xx][yy]!='*')  
            {  
                tt.step=t.step+1;  
                if(map[xx][yy]=='|')   
                {  
                    xx=xx+h[i][0]; yy=yy+h[i][1]; //对达楼梯对面   
                    if(xx>=0&&xx<n&&yy>=0&&yy<m&&map[xx][yy]!='*') //楼梯前面还有路   
                    {  
                        if(t.step%2!=0&&i<=1||t.step%2==0&&i>1)  tt.step+=1;  
                        if(tt.step<tim[xx][yy])  
                        {  
                            tt.x=xx; tt.y=yy;   
                            q.push(tt);  
                            tim[xx][yy]=tt.step;  
                        }  
                    }   
                }  
                else if(map[xx][yy]=='-')  
                {  
                    xx=xx+h[i][0]; yy=yy+h[i][1]; //到达楼梯对面   
                    if(xx>=0&&xx<n&&yy>=0&&yy<m&&map[xx][yy]!='*') //楼梯前面还有路   
                    {  
                        if(t.step%2!=0&&i>1||t.step%2==0&&i<=1)  tt.step+=1;  
                        if(tt.step<tim[xx][yy])  
                        {  
                            tt.x=xx; tt.y=yy;   
                            q.push(tt);  
                            tim[xx][yy]=tt.step;  
                        }  
                    }   
                }  
                else   
                {  
                    if(tt.step<tim[xx][yy])  
                    {  
                        tt.x=xx; tt.y=yy;   
                        q.push(tt);  
                        tim[xx][yy]=tt.step;  
                    }  
                }  
            }  
        }  
    }  
    return tim[e.x][e.y];  
}  
int main(int argc, char *argv[])  
{  
    int i,j;  
    while(cin>>n>>m)  
    {  
        for(i=0;i<n;i++)  
        for(j=0;j<m;j++)  
        {  
            cin>>map[i][j];  
            if(map[i][j]=='S')  
            {  
                s.x=i; s.y=j; s.step=0; tim[i][j]=0;  
            }  
            else if(map[i][j]=='T')  
            {  
                e.x=i; e.y=j;  
            }  
        }  
        memset(tim,0x33,sizeof(tim));  
        cout<<BFS()<<endl;  
    }  
    return 0;  
}  

 

 
补充:软件开发 , C++ ,
CopyRight © 2022 站长资源库 编程知识问答 zzzyk.com All Rights Reserved
部分文章来自网络,