uva 10047 - The Monocycle

这道题让我明白到,广度优先搜索的多维运用,而且要会灵活使用广度优先搜索,最坑爹的是我在方向那里被坑了半天!!!说一个位的颜色不同是一个维度可能比较容易理解,但是说一个格还要考虑方向这个维度,一开始也是想了一下,虽然同一个位置,同一种颜色,但是方向的不同却有可能导致它到另外一个格的时间不一样了,因为改变方向也需要时间,还有一个很坑爹的就是我一开始以为到了一个位置后,走到下一个位置再走回来的时候,是沿路返回,可以倒车,颜色会不变,不单只是是回到原位,连颜色也回到原来的数值,脑残,不是倒车,是改变方向,掉头前进,这样的话颜色就变了。

#include<stdio.h>
#include<string.h>
#define max -1


typedef struct node{
    int dire,color,r,c;
    node *next;
    node(int row,int col,int d,int clr){
        r=row;
        c=col;
        dire=d;
        color=clr;
        next=NULL;
    }
}node;


int minTime[30][30][5][4],vis[30][30][5][4],
    dires[4][2]={{-1,0},{0,1},{1,0},{0,-1}};//竟然在方向这里纠结了一天!!!!!!注意坐标的上下左右究竟是加多少
char square[30][30];
node *top,*rear;


void push(int pt,int i,int j,int d,int c,int step){
    if((minTime[i][j][c][d]==max||minTime[i][j][c][d]>pt+step)&&square[i][j]=='.'){
        minTime[i][j][c][d]=pt+step;
        if(!vis[i][j][c][d])
        {
            vis[i][j][c][d]=1;
            rear->next=new node(i,j,d,c);
            rear=rear->next;
        }
    }
}


main()
{
    int M,N,i,j,end[2],pt,min,t=0,a,b;


    while(scanf("%d %d",&M,&N),M,N){
        getchar();
        memset(minTime,-1,sizeof(minTime));
        memset(vis,0,sizeof(vis));
        for(i=1;i<=M;i++){
            gets(&square[i][1]);
            for(j=1;j<=N;j++){
                if(square[i][j]=='S'){
                    square[i][j]='.';
                    rear=top=new node(i,j,0,0);
                    minTime[i][j][0][0]=0;
                    vis[i][j][0][0]=1;
                }
                else if(square[i][j]=='T'){
                    end[0]=i;
                    end[1]=j;
                    square[i][j]='.';
                }
            }
        }
        memset(square[i],0,N+2);


        while(top!=NULL){
            pt=minTime[top->r][top->c][top->color][top->dire];
            push(pt,top->r+dires[top->dire][0],top->c+dires[top->dire][1],top->dire,(top->color+1)%5,1);//direction 原方向
            push(pt,top->r,top->c,(top->dire+2)%4,top->color,2);//direction 原方向的逆方向
            push(pt,top->r,top->c,(top->dire+3)%4,top->color,1);
            push(pt,top->r,top->c,(top->dire+1)%4,top->color,1);
            vis[top->r][top->c][top->color][top->dire]=0;
            top=top->next;
        }
        min=minTime[end[0]][end[1]][0][0];


        for(i=1;i<4;i++){
            if(minTime[end[0]][end[1]][0][i]!=max&&min>minTime[end[0]][end[1]][0][i]) min=minTime[end[0]][end[1]][0][i];
        }
        if(t)printf("\n");
        if(min==-1)
            printf("Case #%d\ndestination not reachable\n",++t);
        else  printf("Case #%d\nminimum time = %d sec\n",++t,min);


    }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值