uva 10047

来源:互联网 发布:租淘宝店铺多少钱 编辑:程序博客网 时间:2024/05/16 08:01

题意:给你起点和终点,要求在颜色也和起点相同的情况下,最短的步数。。。最短路,果断就是BFS


#include <iostream>#include <cstdio>#include <cstring>using namespace std;const int MAXN = 13000;struct node {    int x;    int y;    int cl;    int di;    int t ;}q[MAXN];char map[50][50];int vis[50][50][5][5],flag,n,m,t;int dx[4] = {-1,0,1,0}; //注意向北的方向要对应好int dy[4] = {0,1,0,-1};void bfs(int x,int y){    int front = 0,rear=1;    node s,u;    s.x=x,s.y=y,s.cl=0,s.di=0,s.t=0;    vis[x][y][0][0] = 1 ;    q[front] = s ;    while ( front < rear )    {        s = q[front++] ;        if (map[s.x][s.y] == 'T' && s.cl == 0)        {            flag = 1 ;            t = s.t ;            return ;        }        int nx = s.x + dx[s.di] ;        int ny = s.y + dy[s.di];        if (nx>=0&&nx<m&&ny>=0&&ny<n&&!vis[nx][ny][(s.cl+1)%5][s.di]&&map[nx][ny]!='#')  //向前        {            u.x = nx,u.y=ny,u.cl=(s.cl+1)%5,u.di=s.di,u.t=s.t+1;            q[rear++] = u ;            vis[nx][ny][u.cl][u.di] = 1;        }        if (!vis[s.x][s.y][s.cl][(s.di+3)%4])   //向右        {             u.x=s.x;u.y=s.y;u.cl=s.cl;u.di=(s.di+3)%4;u.t=s.t+1;               q[rear++]=u;               vis[u.x][u.y][u.cl][u.di]=1;          }        if (!vis[s.x][s.y][s.cl][(s.di+1)%4])   //向左         {               u.x=s.x;u.y=s.y;u.cl=s.cl;u.di=(s.di+1)%4;u.t=s.t+1;               q[rear++]=u;               vis[u.x][u.y][u.cl][u.di]=1;           }      }    return ;}int main(){    int sx,sy;    int cas = 0;    while (scanf("%d%d",&m,&n) != EOF)    {        getchar();        if (m==0 && n==0)            break;        for (int i = 0 ; i < m ; i++)        {            scanf("%s",map[i]);            for (int j = 0 ; j < n ; j++)            {                if (map[i][j] == 'S')                {                    sx = i ;                    sy = j ;                }            }        }        memset(vis,0,sizeof(vis));        flag = 0,t = 0;        bfs(sx,sy);        if (cas)            printf("\n");        printf("Case #%d\n",++cas);        if (!flag)            printf("destination not reachable\n");          else             printf("minimum time = %d sec\n",t);      }    return 0;}



原创粉丝点击