编程介的小学生 2017-02-21 02:03 采纳率: 0.2%
浏览 815
已采纳

Traveling Cube

问题描述 :

On a small planet named Bandai, a landing party of the starship Tadamigawa discovered colorful cubes traveling on flat areas of the planet surface, which the landing party named beds. A cube appears at a certain position on a bed, travels on the bed for a while, and then disappears. After a longtime observation, a science officer Lt. Alyssa Ogawa of Tadamigawa found the rule how a cube travels on a bed.

A bed is a rectangular area tiled with squares of the same size.

One of the squares is colored red,

one colored green,

one colored blue,

one colored cyan,

one colored magenta,

one colored yellow,

one or more colored white, and

all others, if any, colored black.

Initially, a cube appears on one of the white squares. The cube’s faces are colored as follows.
top red

bottom cyan

north green

south magenta

east blue

west yellow

The cube can roll around a side of the current square at a step and thus rolls on to an adjacent square. When the cube rolls on to a chromatically colored (red, green, blue, cyan, magenta or yellow) square, the top face of the cube after the roll should be colored the same. When the cube rolls on to a white square, there is no such restriction. The cube should never roll on to a black square.

Throughout the travel, the cube can visit each of the chromatically colored squares only once, and any of the white squares arbitrarily many times. As already mentioned, the cube can never visit any of the black squares. On visit to the final chromatically colored square, the cube disappears. Somehow the order of visits to the chromatically colored squares is known to us before the travel starts. Your mission is to find the least number of steps for the cube to visit all the chromatically colored squares in the given order.

输入:

The input is a sequence of datasets. A dataset is formatted as follows:

w d

c11 ・ ・ ・ cw1

c1d ・ ・ ・ cwd

v1v2v3v4v5v6

The first line is a pair of positive integers w and d separated by a space. The next d lines are w-character-long strings c11 ・ ・ ・ cw1,. . . , c1d ・ ・ ・ cwd with no spaces. Each character cij is one of the letters r, g, b, c, m, y, w and k, which stands for red, green, blue, cyan, magenta, yellow, white and black respectively, or a sign #. Each of r, g, b, c, m, y and # occurs once and only once in a dataset. The last line is a six-character-long string v1v2v3v4v5v6 which is a permutation of “rgbcmy”.

The integers w and d denote the width (the length from the east end to the west end) and the depth (the length from the north end to the south end) of a bed. The unit is the length of a side of a square. You can assume that neither w nor d is greater than 30.

Each character cij shows the color of a square in the bed. The characters c11, cw1, c1d and cwd correspond to the north-west corner, the north-east corner, the south-west corner and the southeast corner of the bed respectively. If cij is a letter, it indicates the color of the corresponding square. If cij is a #, the corresponding square is colored white and is the initial position of the cube. The string v1v2v3v4v5v6 shows the order of colors of squares to visit. The cube should visit the squares colored v1, v2, v3, v4, v5 and v6 in this order.

The end of the input is indicated by a line containing two zeros separated by a space.

输出:

The input is a sequence of datasets. A dataset is formatted as follows:

w d

c11 ・ ・ ・ cw1

c1d ・ ・ ・ cwd

v1v2v3v4v5v6

The first line is a pair of positive integers w and d separated by a space. The next d lines are w-character-long strings c11 ・ ・ ・ cw1,. . . , c1d ・ ・ ・ cwd with no spaces. Each character cij is one of the letters r, g, b, c, m, y, w and k, which stands for red, green, blue, cyan, magenta, yellow, white and black respectively, or a sign #. Each of r, g, b, c, m, y and # occurs once and only once in a dataset. The last line is a six-character-long string v1v2v3v4v5v6 which is a permutation of “rgbcmy”.

The integers w and d denote the width (the length from the east end to the west end) and the depth (the length from the north end to the south end) of a bed. The unit is the length of a side of a square. You can assume that neither w nor d is greater than 30.

Each character cij shows the color of a square in the bed. The characters c11, cw1, c1d and cwd correspond to the north-west corner, the north-east corner, the south-west corner and the southeast corner of the bed respectively. If cij is a letter, it indicates the color of the corresponding square. If cij is a #, the corresponding square is colored white and is the initial position of the cube. The string v1v2v3v4v5v6 shows the order of colors of squares to visit. The cube should visit the squares colored v1, v2, v3, v4, v5 and v6 in this order.

The end of the input is indicated by a line containing two zeros separated by a space.

样例输入:

10 5
kkkkkwwwww
w#wwwrwwww
wwwwbgwwww
kwwmcwwwkk
kkwywwwkkk
rgbcmy
10 5
kkkkkkkkkk
k#kkkkkkkk
kwkkkkkwwk
kcmyrgbwwk
kwwwwwwwwk
cmyrgb
10 5
kkkkkkkkkk
k#kkkkkkkk
kwkkkkkwkk
kcmyrgbwwk
kwwwwwwwwk
cmyrgb
0 0
样例输出:

9
49
unreachable

  • 写回答

3条回答 默认 最新

  • devmiao 2017-02-21 16:47
    关注
     #include<stdio.h>
    #include<string.h>
    #include<algorithm>
    #include<queue>
    #include<vector>
    using namespace std;
    
    bool vis[35][35][300][7];
    struct node
    {
        int x;
        int y;
        int z;
        int w;
        int step;
    };
    int x,y,ans;
    int dx[4]={1,0,-1,0};
    int dy[4]={0,1,0,-1};
    char map[35][35];
    char res[10];
    void init()
    {
        memset(map,0,sizeof(map));
        memset(vis,0,sizeof(vis));
    }
    
    int tomy(int sta)
    {
        int a, b, c;
        a=sta%6; b=sta/6%6; c=sta/36%6;
        int d, e, f;
        d=5-a, e=5-b, f=5-c;
        return a+d*6+e*36+b*216+c*1296+f*7776;
    }
    int top(int sta)
    {
        return sta%6;
    }
    int bt(int sta)
    {
        return sta/6%6;
    }
    int nor(int sta)
    {
        return sta/36%6;
    }
    int sou(int sta)
    {
        return sta/216%6;
    }
    int wes(int sta)
    {
        return sta/1296%6;
    }
    int eas(int sta)
    {
        return sta/7776%6;
    }
    int up(int sta)
    {
        int t1, n1, s1, b1, e1, w1;
        t1=sou(sta);
        n1=top(sta);
        s1=bt(sta);
        b1=nor(sta);
        e1=eas(sta);
        w1=wes(sta);
        return t1+s1*6+w1*36;
    }
    int down(int sta)
    {
        int t1, n1, s1, b1, e1, w1;
        t1=nor(sta);
        n1=bt(sta);
        s1=top(sta);
        b1=sou(sta);
        e1=eas(sta);
        w1=wes(sta);
        return t1+s1*6+w1*36;
    }
    int left(int sta)
    {
        int t1, n1, s1, b1, e1, w1;
        t1=eas(sta);
        w1=top(sta);
        b1=wes(sta);
        e1=bt(sta);
        n1=nor(sta);
        s1=sou(sta);
        return t1+s1*6+w1*36;
    }
    int right(int sta)
    {
        int t1, n1, s1, b1, e1, w1;
        t1=wes(sta);
        w1=bt(sta);
        b1=eas(sta);
        e1=top(sta);
        n1=nor(sta);
        s1=sou(sta);
        return t1+s1*6+w1*36;
    }
    
    char s[]="rmybgc";
    
    bool bfs()
    {
        node n1,n2;
        n1.x=x;
        n1.y=y;
        n1.z=0;
        n1.w=78;
        n1.step=0;
        vis[x][y][78][0]=1;
        queue<node> q;
        q.push(n1);
        while(!q.empty())
        {
            node n2=q.front();
            if(n2.z==6)
            {
                ans=n2.step;
                return true;
            }
            q.pop();
            int t=tomy(n2.w);
            for(int i=0;i<4;i++)
            {
                int tmpx=dx[i]+n2.x;
                int tmpy=dy[i]+n2.y;
                if(map[tmpx][tmpy]=='w')
                {
                    int temp;
                    if(i==0)
                        temp=right(t);
                    else if(i==1)
                        temp=down(t);
                    else if(i==2)
                        temp=left(t);
                    else
                        temp=up(t);
    
                    if(vis[tmpx][tmpy][temp][n2.z]==0)
                    {
                        vis[tmpx][tmpy][temp][n2.z]=1;
                        n1.x=tmpx;
                        n1.y=tmpy;
                        n1.w=temp;
                        n1.z=n2.z;
                        n1.step=n2.step+1;
                        q.push(n1);
                    }
                }
                else if(map[tmpx][tmpy]==res[n2.z])
                {
                    int temp;
                    if(i==0)
                        temp=right(t);
                    else if(i==1)
                        temp=down(t);
                    else if(i==2)
                        temp=left(t);
                    else
                        temp=up(t);
    
                    int top=temp%6;
    
                    if(vis[tmpx][tmpy][temp][n2.z+1]==0&&s[top]==res[n2.z])
                    {
                        n1.x=tmpx;
                        n1.y=tmpy;
                        n1.w=temp;
                        n1.z=n2.z+1;
                        n1.step=n2.step+1;
                        vis[tmpx][tmpy][temp][n2.z+1]=1;
                        q.push(n1);
                    }
                }
            }
    
        }
        return false;
    }
    int main()
    {
        int n,d;
        while(scanf("%d%d",&n,&d)!=EOF&&n+d)
        {
            init();
            for(int i=1;i<=d;i++)
                for(int j=1;j<=n;j++)
                {
                    scanf(" %c",&map[j][i]);
                    if(map[j][i]=='#')
                    {
                        x=j;
                        y=i;
                        map[j][i]='w';
                    }
                }
            scanf(" %s",res);
            if(bfs())
                printf("%d\n",ans);
            else
                printf("unreachable\n");
        }
        return 0 ;
    }
    
    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(2条)

报告相同问题?

悬赏问题

  • ¥15 Android STD快速启动
  • ¥15 如何使用simulink建立一个永磁同步直线电机模型?
  • ¥30 天体光谱图的的绘制并得到星表
  • ¥15 PointNet++的onnx模型只能使用一次
  • ¥20 西南科技大学数字信号处理
  • ¥15 有两个非常“自以为是”烦人的问题急期待大家解决!
  • ¥30 STM32 INMP441无法读取数据
  • ¥15 R语言绘制密度图,一个密度曲线内fill不同颜色如何实现
  • ¥100 求汇川机器人IRCB300控制器和示教器同版本升级固件文件升级包
  • ¥15 用visualstudio2022创建vue项目后无法启动