现在的位置: 首页 > 综合 > 正文

hdu 1180

2018年01月11日 ⁄ 综合 ⁄ 共 1895字 ⁄ 字号 评论关闭

诡异的楼梯

大多数都是用优先队列写的。以前不会优先队列 - - 写的好蛋疼。

还是在学长帮我改了下才AC的。。。

#include <cstdio>
#include <cstring>
#include <iostream>
using namespace std;
#define MAX 30
int m,n;
int i,j,x,y,x1,y1;
int fx[] = {1,-1,0,0};
int fy[] = {0,0,1,-1};
char map[MAX][MAX];
int step[MAX][MAX];
struct Point{
    int x,y,t;
}que[50000];
void bfs(){
    int head,tail;
    Point now,next;
    que[head = tail = 0] = (Point){x,y,0};
    step[x][y] = 0;
    while (head <= tail){
        now = que[head++];
        step[now.x][now.y]=now.t;
        if (map[now.x][now.y]=='T'){
            printf("%d\n",now.t);
            return ;
        }
        for (i = 0;i < 4;i++){
            next = (Point){now.x + fx[i],now.y + fy[i],now.t+1};
            if (next.x < 0 || next.x >= m || next.y < 0 || next.y >= n || step[next.x][next.y] != -1)
                continue;
            if (map[next.x][next.y] == '.' || map[next.x][next.y]=='T'){
                step[next.x][next.y] = step[now.x][now.y] + 1;
                que[++tail] = next;
                continue;
            }
            if (map[next.x][next.y] == '|'){
                next.x+=fx[i];
                next.y+=fy[i];
                if (next.x < 0 || next.x >= m || next.y < 0 || next.y >= n || step[next.x][next.y] != -1)continue;
                if (map[next.x][next.y] != '.' && map[next.x][next.y]!='T')continue;

                if ((step[now.x][now.y] ) % 2 == 1 && (i == 2 || i == 3) || (step[now.x][now.y] ) %2 == 0 && (i == 0 || i == 1))//横着走
                {
                    step[next.x][next.y] = step[now.x][now.y] + 1;
                    que[++tail] = next;
                    continue;
                }
                que[++tail] = (Point){
                    now.x,now.y,now.t + 1
                };
                continue;
            }
            if (map[next.x][next.y] == '-'){
                next.x+=fx[i];
                next.y+=fy[i];
                if (next.x < 0 || next.x >= m || next.y < 0 || next.y >= n || step[next.x][next.y] != -1)continue;
                if (map[next.x][next.y] != '.' && map[next.x][next.y]!='T')continue;
                if ((step[now.x][now.y] ) %2 == 0 && (i == 2 || i == 3) || (step[now.x][now.y] ) %2 == 1 && (i == 1 || i == 0))//横着走
                {
                    step[next.x][next.y] = step[now.x][now.y] + 1;
                    que[++tail] = next;
                    continue;
                }
                que[++tail] = (Point){now.x,now.y,now.t + 1};
                continue;
            }
        }
    }
}
int main(){
    while (~scanf("%d%d",&m,&n)){
        for (i = 0;i < m;i++){
            scanf("%s",map[i]);
            for (j = 0;j < n;j++){
                step[i][j] = -1;
                if (map[i][j] == 'S'){
                    x = i;
                    y = j;
                }
                if (map[i][j] == 'T'){
                    x1 = i;
                    y1 = j;
                }
            }
        }
        bfs();
           continue;
        for (i = 0;i < n;i++)
        {
            for (j = 0;j < m;j++)
                printf("%-3d ",step[i][j]);
            printf("\n");
        }
    }
    return 0;
}

/*
5 5
**...
**.*.
..|T.
.*.**
S....

5 5
**...
**.*.
..|*T
.*.**
S....


5 5
**...
**.*.
..|..
.*.**
S*..T
*/

抱歉!评论已关闭.