筛子翻转路径

  2020-4-27 


一个地图,#表示可走的格子,.代表不可走的格子,S代表起点,E代表终点,没有岔路且S到E必可达

S上摆放了一个筛子:前面为3,后面为4,上面为1,底面为6,左面为5,右面为2

筛子只能通过翻转从S走到E,每翻转一次,筛子就会给路径上的格子染上与底面同样的颜色(用数字表示)

请输出骰子到终点后的地图

输入第一行为组数,第二行为地图尺寸

输入示例:

1
5
S###.
...#.
E#.##
.#..#
.####

示例答案:

6215.
...4.
12.26
.3..3
.5621

解答

主要就是明确筛子的状态空间

只有一条路径,无岔路,我这里看成有岔路了,然后写dfs去找正确路径耽误了时间。。

import java.util.Scanner;

class S
{
    int qian,hou,shang,xia,zuo,you;
    int temp_shang,temp_xia,temp_zuo,temp_you;
    S(int qian,int hou, int shang ,int xia,int zuo,int you)
    {
        this.qian = qian;
        this.hou = hou;
        this.shang = shang;
        this.xia = xia;
        this.zuo = zuo;
        this.you = you;
    }
    void youFan()
    {
        temp_zuo = zuo;
        temp_you = you;
        you = shang;
        zuo = xia;
        shang = temp_zuo;
        xia = temp_you;
    }
    void xiaFan()
    {
        temp_shang = shang;
        temp_xia = xia;
        xia = qian;
        shang = hou;
        qian = temp_shang;
        hou = temp_xia;
    }
    void zuoFan()
    {
        temp_zuo = zuo;
        temp_you = you;
        zuo = shang;
        you = xia;
        xia = temp_zuo;
        shang = temp_you;
    }
    void shangFan()
    {
         temp_shang = shang;
         temp_xia = xia;
         shang = qian;
         xia = hou;
         hou = temp_shang;
         qian = temp_xia;
    }
    int color()
    {
        return xia;
    }
}

public class Main
{
    public static void main(String[] args)
    {
        Scanner sc = new Scanner(System.in);
        int T = sc.nextInt();
        for(int group=0;group<T;group++)
        {
            int n = sc.nextInt();
            int[][] array = new int[n][n];

            int startX = 0,startY=0;
            int endX =0 ,endY=0;
            for(int x=0;x<n;x++)
            {
                String line = sc.next();
                for (int y = 0; y < n; y++) {
                    if (line.charAt(y) == 'S') {
                        array[x][y] = 6;
                        startX = x;
                        startY = y;
                    }
                    if (line.charAt(y) == 'E')
                    {
                        array[x][y] = 0;
                        endX = x;
                        endY = y;
                    }
                    if (line.charAt(y) == '#')
                        array[x][y] = 0;
                    if (line.charAt(y) == '.')
                        array[x][y] = -9;
                }
            }

            //新建筛子
            S shaizi = new S(3,4,1,6,5,2);

            int i=startX,j=startY;
            while(!(i==endX&&j==endY))
            {
                //上
                if (i+1<n)
                    if(array[i+1][j]==0)
                    {
                        shaizi.shangFan();
                        array[i+1][j]=shaizi.color();
                        i++;
                        continue;
                    }

                //下
                if (i-1>=0)
                    if(array[i-1][j]==0)
                    {
                        shaizi.xiaFan();
                        array[i-1][j]=shaizi.color();
                        i--;
                        continue;
                    }

                //右
                if (j+1<n)
                    if(array[i][j+1]==0)
                    {
                        shaizi.youFan();
                        array[i][j+1]=shaizi.color();
                        j++;
                        continue;
                    }

                //左
                if (j-1>=0)
                    if(array[i][j-1]==0)
                    {
                        shaizi.zuoFan();
                        array[i][j-1]=shaizi.color();
                        j--;
                        continue;
                    }
            }
            array[i][j]=shaizi.color();

            //输出array
            for(int i1 = 0; i1 < n; i1++)
            {
                for (int j1 = 0; j1 < n; j1++)
                {
                    if (array[i1][j1]==-9)
                        System.out.print(".");
                    else{
                        System.out.print(array[i1][j1]);
                    }
                }
                System.out.println();
            }
        }
    }
}

且听风吟