文章标题

6 篇文章 0 订阅

题意:个你一个转轮,有5种颜色,为了5中颜色的位置是确定的,为了方便处理我们用01234来表示绿,黑,红,蓝,白。轮子可以沿着它的方向滚动(只能是它当前的方向不能相反方向),每滚动一次会到达另一个格子,着地的颜色会改变,变了之前颜色的下一个,例如当前是绿色着地下一次就是黑色,依次是红蓝白。也可以原地转动(顺逆时针都可以),原地转动其实就是改变了轮子的滚动方向,原地转动每次能转90度。原地转动一次和滚动一次时间都是1秒。另外轮子有4个方向,上北下南左西又东。

另外给你n*m个格子,有些格子不能到达,用#表示,给你起点S和终点T。在起点时轮子方向规定向北,绿色着地,然后滚动到终点,要求绿色着地,但是方向不做要求,问能不能做到,能的话输出最小时间

#include<cstdio>
#include<queue>
#include<iostream>
#include<algorithm>
#include<cstring>
#include<string>
using namespace std;
char a[30][30];
int vis[30][30][4][5];
int n,m;
int dx[4]={-1,0,1,0};
int dy[4]={0,1,0,-1};
struct node {

    int x,y,di,co,t;
    node(int xx, int yy, int d, int c, int st) {
        x = xx;
        y = yy;
        di = d;
        co = c;
        t = st;
    }
};
queue<node> q;
void bfs() {

    while(!q.empty()) {
        node u = q.front();
        q.pop();
        if(a[u.x][u.y] == 'T' && u.co==0) {
            printf("minimum time = %d sec\n",u.t);
            return;
        }
        int x=u.x;
        int y=u.y;
        int co=u.co;
        //turn right
        int di=(u.di+1)%4;
        if(!vis[x][y][di][co]) {

            vis[x][y][di][co] = 1;
            q.push(node(x,y,di,co,u.t+1));
        }       
        //turn right
        di=(u.di+3)%4;
        if(!vis[x][y][di][co]) {

            vis[x][y][di][co] = 1;
            q.push(node(x,y,di,co,u.t+1));
        }
        di = u.di;
        x += dx[di];
        y += dy[di];
        co = (co+1)%5;
        if(x<n&&x>=0&&y<m&&y>=0&&a[x][y]!='#'&&!vis[x][y][di][co]) {
            q.push(node(x,y,di,co,u.t+1));
            vis[x][y][di][co] = 1;
        }
    }
    printf("destination not reachable\n");
}



int main() {
    int ss = 1;
    while(scanf("%d%d", &n, &m) &&n &&m) {

        if(ss>1) printf("\n");
        memset(vis, 0, sizeof(vis));
        while(!q.empty()) {

            q.pop();
        }
        for(int i=0; i<n; i++) {
            for(int j=0; j<m; j++) {
                cin>>a[i][j];
                if(a[i][j]=='S') {
                    q.push(node(i,j,0,0,0));
                    vis[i][j][0][0]=1;
                }
            }
        }
        printf("Case #%d\n",ss++);
        bfs();

    }
    return 0;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值