杭电1180 诡异的楼梯

来源:互联网 发布:nginx配置静态页面 编辑:程序博客网 时间:2024/06/02 10:58
BFS

题目大意是说:给你一张地图,给你起点,终点,问你从起点走到终点的最少时间(一格是一时间单位),简单来说就是BFS 求最短路径问

题;

这个题需要注意的是:如果走到楼梯上,且当时楼梯是不可走状态,可以原地呆在那(当时没看见,WA五六遍,,,),等楼梯可走时再走



可以直接写BFS,也可以优先队列;

#include<stdio.h>#include<string.h>#include<math.h>#include<queue>#include<algorithm>using namespace std;struct point{    int x,y,step;};point bg;char mp[25][25];int mark[25][25];int dir[4][2] = { {1,0},{-1,0},{0,-1},{0,1} };int bfs(){    queue<point> ss;    ss.push(bg);    mark[bg.x][bg.y]=0;    while(ss.size())    {        point f=ss.front();        ss.pop();        for(int i=0; i<4; i++)        {            point g;            g.x = f.x + dir[i][0];            g.y = f.y + dir[i][1];            g.step = f.step + 1;            if(mp[g.x][g.y] != '*' && mark[g.x][g.y] > g.step)            {                if( mp[g.x][g.y] == '-')                {                    if((f.step&1)&&(i>=2))//两个if判断楼梯当前状态是否可走,若不可走,将原地址加入队列,时间加一;                    {                        g.x = f.x, g.y = f.y;                        mark[g.x][g.y] = g.step;                        ss.push(g);                        continue;                    }                    if(((f.step&1)==0)&&(i<2))                    {                        g.x = f.x, g.y = f.y;                        mark[g.x][g.y] = g.step;                        ss.push(g);                        continue;                    }                    g.x = g.x + dir[i][0] , g.y = g.y + dir[i][1];                    if( mark[g.x][g.y] <= g.step )  continue;                    if(mp[g.x][g.y]=='.')//判断楼梯后面是否可走;                    {                        mark[g.x][g.y] = g.step;                        ss.push(g);                    }                    else if(mp[g.x][g.y]=='T')                        return g.step;                }                else if(mp[g.x][g.y]=='|')                {                    if((f.step&1)&& i<2)                    {                        g.x = f.x, g.y = f.y;                        mark[g.x][g.y] = g.step;                        ss.push(g);                        continue;                    }                    if( ((f.step&1)==0) && i>= 2)                    {                        g.x = f.x, g.y = f.y;                        mark[g.x][g.y] = g.step;                        ss.push(g);                        continue;                    }                    g.x = g.x + dir[i][0] ,g.y = g.y + dir[i][1];                    if( mark[g.x][g.y]<=g.step ) continue;                    if(mp[g.x][g.y]=='.')                    {                        mark[g.x][g.y] = g.step;                        ss.push(g);                    }                    else if(mp[g.x][g.y]=='T')                        return g.step;                }                else if(mp[g.x][g.y]=='.')                {                    mark[g.x][g.y] = g.step;                    ss.push(g);                }                else if(mp[g.x][g.y]=='T')                    return g.step;            }        }    }    return 0;}int main(){    int m,n;    while(scanf("%d%d",&m,&n)!=EOF)    {        for(int i=0; i<22; i++)            for(int j=0; j<22; j++)                mp[i][j]='*', mark[i][j]=0x3f3f3f3f;        for(int i=1; i<=m; i++)        {            for(int j=1; j<=n; j++)            {                scanf(" %c",&mp[i][j]);                if( mp[i][j]=='S' )                    mp[i][j]='.',  bg.x=i,  bg.y=j,  bg.step=0;            }        }        printf("%d\n",bfs());    }    return 0;}


0 0
原创粉丝点击