题意:给定起点和终点,算时间。

注意:判断扩展的点为'|'或者'-'时,到达此点楼梯的状态。

本来能有优先队列做的,我犯贱咯!等一天补上优先队列的代码;

连接:http://acm.hdu.edu.cn/showproblem.php?pid=1180

View Code
#include <iostream>
using namespace std;
#include <queue>
const int MAX = 20+10;
char map[MAX][MAX];
//bool used[MAX][MAX];
int starti,startj,n,m;
int dir[4][2]={{0,1},{0,-1},{1,0},{-1,0}};
struct node
{
    int i;
    int j;
    int sum;
};
int bfs()
{
    queue<node>q;
    node flag;
    flag.i=starti;
    flag.j=startj;
    flag.sum=0;
    q.push(flag);
    map[flag.i][flag.j]='*';
    while(!q.empty())
    {
        flag=q.front();
        q.pop();
        for(int i=0;i<4;i++)
        {
            node temp;
            temp=flag;
            temp.i+=dir[i][0];
            temp.j+=dir[i][1];
            if(map[temp.i][temp.j]!='*')
            {
                if(map[temp.i][temp.j]=='T')
                {
                    temp.sum++;
                    return temp.sum;
                }
                if(map[temp.i][temp.j]=='.')
                {
                    temp.sum=flag.sum+1;;
                    map[temp.i][temp.j]='*';
                    q.push(temp);
                }
                if(map[temp.i][temp.j]=='|')
                {
                    if((dir[i][0]==0&&dir[i][1]==1)||(dir[i][0]==0&&dir[i][1]==-1))//更新的点为|且可以走,就直接走楼梯。从上到下,或者从下向上走
                    {
                        if(flag.sum%2==1)
                        {
                            if((map[temp.i+dir[i][0]][temp.j+dir[i][1]]=='.')||map[temp.i+dir[i][0]][temp.j+dir[i][1]]=='T')
                            {
                                if(map[temp.i+dir[i][0]][temp.j+dir[i][1]]=='T')
                                {
                                    temp.sum++;
                                    return temp.sum;
                                }
                                temp.i+=dir[i][0];
                                temp.j+=dir[i][1];
                                temp.sum=flag.sum+1;
                                map[temp.i][temp.j]='*';
                                q.push(temp);
                            }
                            else continue;//
                        }
                        else //更新的点为|且不可以走,即从上到下,或者从下向上走,就直接把自己入队。
                        {
                            temp.i-=dir[i][0];
                            temp.j-=dir[i][1];
                            temp.sum=flag.sum+1;
                            map[temp.i][temp.j]='*';
                            q.push(temp);
                        }
                    }
                    if((dir[i][0]==1&&dir[i][1]==0)||(dir[i][0]==-1&&dir[i][1]==0))
                    {
                        if(flag.sum%2==0)
                        {
                            if(map[temp.i+dir[i][0]][temp.j+dir[i][1]]=='.'||map[temp.i+dir[i][0]][temp.j+dir[i][1]]=='T')//更新的点为|且可以走,就直接走楼梯。//更新的点为|且可以走,就直接走楼梯。从右到左,或者从左向右走
                            {
                                if(map[temp.i+dir[i][0]][temp.j+dir[i][1]]=='T')
                                {
                                    temp.sum++;
                                    return temp.sum;
                                }
                                temp.i+=dir[i][0];
                                temp.j+=dir[i][1];
                                temp.sum=flag.sum+1;
                                map[temp.i][temp.j]='*';
                                q.push(temp);
                            }
                            else continue;//
                        }
                        else //更新的点为|且不可以走,就直接把自己入队。//更新的点为|且可以走,就直接走楼梯。从左到右,或者从右向上左
                        {
                            temp.i-=dir[i][0];
                            temp.j-=dir[i][1];
                            temp.sum=flag.sum+1;
                            map[temp.i][temp.j]='*';
                            q.push(temp);
                        }
                    }
                }
                if(map[temp.i][temp.j]=='-')
                {
                    if((dir[i][0]==0&&dir[i][1]==1)||(dir[i][0]==0&&dir[i][1]==-1))
                    {
                        if(flag.sum%2==0){
                            if(map[temp.i+dir[i][0]][temp.j+dir[i][1]]=='.'||map[temp.i+dir[i][0]][temp.j+dir[i][1]]=='T')//更新的点为-且可以走,就直接走楼梯。从上到下,或者从下向上走
                            {
                                if(map[temp.i+dir[i][0]][temp.j+dir[i][1]]=='T')
                                {
                                    temp.sum++;
                                    return temp.sum;
                                }
                                temp.i+=dir[i][0];
                                temp.j+=dir[i][1];
                                temp.sum=flag.sum+1;
                                map[temp.i][temp.j]='*';
                                q.push(temp);
                            }
                            else continue;//
                        }
                        else //更新的点为-且不可以走,就直接走楼梯。从上到下,或者从下向上走
                        {
                            temp.i-=dir[i][0];
                            temp.j-=dir[i][1];
                            temp.sum=flag.sum+1;
                            map[temp.i][temp.j]='*';
                            q.push(temp);
                        }
                    }
                    if((dir[i][0]==1&&dir[i][1]==0)||(dir[i][0]==-1&&dir[i][1]==0))
                    {
                        if(flag.sum%2==1)
                        {
                            if(map[temp.i+dir[i][0]][temp.j+dir[i][1]]=='.'||map[temp.i+dir[i][0]][temp.j+dir[i][1]]=='T')//更新的点为-且可以走,就直接走楼梯。从左到右,或者从右向左走
                            {
                                if(map[temp.i+dir[i][0]][temp.j+dir[i][1]]=='T')
                                {
                                    temp.sum++;
                                    return temp.sum;
                                }
                                temp.i+=dir[i][0];
                                temp.j+=dir[i][1];
                                temp.sum=flag.sum+1;
                                map[temp.i][temp.j]='*';
                                q.push(temp);
                            }
                            else continue;//
                        }
                        else //更新的点为-且可以走,就直接走楼梯。从左到右,或者从右向左走
                        {
                            temp.i-=dir[i][0];
                            temp.j-=dir[i][1];
                            temp.sum=flag.sum+1;
                            map[temp.i][temp.j]='*';
                            q.push(temp);
                        }
                    }
                }
            }
        }
    }
    return 0;    
}
int main()
{
    while(~scanf("%d%d",&n,&m))
    {
        getchar();
        memset(map,'*',sizeof(map));
        for(int i=1;i<=n;i++)
        {
            for(int j=1;j<=m;j++)
            {
                scanf("%c",&map[i][j]);
                if(map[i][j]=='S')
                {
                    starti=i;
                    startj=j;
                }
            }
            getchar();
        }
        printf("%d\n",bfs());
    }
    return 0;
}