zoukankan      html  css  js  c++  java
  • 牛客寒假算法基础集训营5 炫酷镜子(dfs)

    炫酷镜子

    链接:https://ac.nowcoder.com/acm/contest/331/I

    题目描述

    小希拿到了一个镜子块,镜子块可以视为一个N x M的方格图,里面每个格子仅可能安装`\`或者`/`的镜子,会反射90°光线,也可能没有安装镜子,使用`.`代替。

    但她看不清楚里面的镜子构造是怎样的。

    你是这块镜子块的主人,所以你想计算这块镜子块(从输入的上方往下射入光线)从左到右每一格射入依次分别会从最下面的哪一格子射出,如果无法射出,输出-1。

    输入描述:

    第一行输入两个整数N,M。随后的N行,每行M个字符。

    1N,M5001≤N,M≤500

    输出描述:

    输出M行整数,依次为从第i个格子从上往下射入时从下面的哪里射出,如果光线不会从下面射出,则输出-1。
    示例1

    输入

    3 3
    ...
    ...
    .

    输出

    3
    2
    -1

    说明

    第一列遇到镜子两次反弹通过第三列射出。

    第二列直接射出。

    第三列因为镜子反弹后向右边射出。
     1 import java.util.Scanner;
     2 
     3 public class Main { 
     4     static final int maxn = 510;
     5     static int n,m;
     6     static int pos=-1,flag=0;
     7     static String []  s = new String[maxn];
     8     static char [][] mp = new char[maxn][maxn];
     9     static void dfs(int x,int y,char dir)
    10     {
    11         if(flag!=0)return;
    12         if(x<0||y<0||y>=m)
    13         {
    14             flag=1;
    15             pos=-2;
    16             return;
    17         }
    18         if(x>=n)
    19         {
    20             flag=1;
    21             pos=y;
    22             return ;
    23         }
    24         if(dir=='D')
    25         {
    26             for(int i=x;i<n;i++)
    27             {
    28                 if(mp[i][y]=='\')
    29                     dfs(i,y+1,'R');
    30                 else if(mp[i][y]=='/')
    31                     dfs(i,y-1,'L');
    32                 else
    33                     dfs(i+1,y,'D');
    34             }
    35         }
    36         else if(dir=='U')
    37         {
    38             for(int i=x;i>=0;i--)
    39             {
    40                 if(mp[i][y]=='\')
    41                     dfs(i,y-1,'L');
    42                 else if(mp[i][y]=='/')
    43                     dfs(i,y+1,'R');
    44                 else
    45                     dfs(i-1,y,'U');
    46             }
    47         }
    48         else if(dir=='L')
    49         {
    50             for(int j=y;j>=0;j--)
    51             {
    52                 if(mp[x][j]=='\')
    53                     dfs(x-1,j,'U');
    54                 else if(mp[x][j]=='/')
    55                     dfs(x+1,j,'D');
    56                 else
    57                     dfs(x,j-1,'L');
    58             }
    59         }
    60         else
    61         {
    62             for(int j=y;j<m;j++)
    63             {
    64                 if(mp[x][j]=='\')
    65                     dfs(x+1,j,'D');
    66                 else if(mp[x][j]=='/')
    67                     dfs(x-1,j,'U');
    68                 else
    69                     dfs(x,j+1,'R');
    70             }
    71         }
    72     }
    73     public static void main(String[] args) {
    74         Scanner cin = new Scanner(System.in);
    75         n = cin.nextInt();
    76         m = cin.nextInt();
    77         for(int i=0;i<n;i++)
    78             s[i] = cin.next();
    79         for(int i=0;i<n;i++)
    80             for(int j=0;j<m;j++)
    81                 mp[i][j] = s[i].charAt(j);
    82         
    83         for(int i=0;i<m;i++) {
    84             flag = 0;
    85             pos = -2;
    86             dfs(0,i,'D');
    87             System.out.println(pos+1);
    88         }
    89     }
    90 }
    
    
    
     
  • 相关阅读:
    PTA习题解析——修理牧场(2 种解法)
    MySQL——维护和用户管理
    MySQL 5+ 特性
    MySQL——增、删、改
    数字时代云计算与边缘计算的区别
    5G对工业互联网应用的影响
    物联网新商业四大趋势
    变革之下,“大数据安全”成数字化转型“必答题”
    Serverless 的初心、现状和未来
    7 个建议让 Code Review 高效又高质
  • 原文地址:https://www.cnblogs.com/1013star/p/10372136.html
Copyright © 2011-2022 走看看