1. 程式人生 > >牛客寒假算法基礎集訓營5 炫酷鏡子(dfs)

牛客寒假算法基礎集訓營5 炫酷鏡子(dfs)

不清楚 int() prev args 一個 element sca println c-s

炫酷鏡子

鏈接: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 }

 

牛客寒假算法基礎集訓營5 炫酷鏡子(dfs)