牛客寒假算法基礎集訓營5 I 炫酷鏡子
阿新 • • 發佈:2019-02-02
div right std targe contest return 直線 test 本地
鏈接:https://ac.nowcoder.com/acm/contest/331/I
來源:牛客網
小希拿到了一個鏡子塊,鏡子塊可以視為一個N x M的方格圖,裏面每個格子僅可能安裝`\`或者`/`的鏡子,會反射90°光線,也可能沒有安裝鏡子,使用`.`代替。
但她看不清楚裏面的鏡子構造是怎樣的。
你是這塊鏡子塊的主人,所以你想計算這塊鏡子塊(從輸入的上方往下射入光線)從左到右每一格射入依次分別會從最下面的哪一格子射出,如果無法射出,輸出-1。
純模擬,因為光沿直線傳播,一直跑就行。
剛開始各種本地沒結果。。
細節:改變方向時先判斷是否越界 越界出答案,每越界的話,走到改變後的第一個位置
代碼有點醜。
1 #include<stdio.h> 2 #include<string.h> 3 int n,m,ans[510],newx,newy; 4 char g[510][510]; 5 6 int work(int x,int y) { 7 int newx=x,newy=y,op=1; 8 bool flag; 9 while(1) { 10 flag=false; 11 if(op==1) { //down 12 for(inti=newx;i<n;i++) { 13 if(g[i][newy]==‘\\‘) { 14 flag=true; 15 if(newy+1==m) return -1; 16 newx=i; 17 newy++; 18 op=2; //--->right 19 break; 20 } elseif(g[i][newy]==‘/‘) { 21 flag=true; 22 if(newy-1<0) return -1; 23 newx=i; 24 newy--; 25 op=4; //--->left 26 break; 27 } 28 } 29 if(!flag) return newy; 30 } else if(op==2){ //right 31 for(int i=newy;i<m;i++) { 32 if(g[newx][i]==‘\\‘) { 33 flag=true; 34 if(newx+1==n) return i; 35 newy=i; 36 newx++; 37 op=1; //--->down 38 break; 39 }else if(g[newx][i]==‘/‘) { 40 flag=true; 41 if(newx-1<0) return -1; 42 newx--; 43 newy=i; 44 op=3; //---->up 45 break; 46 } 47 } 48 if(!flag) return -1; 49 } else if(op==3) { //up 50 for(int i=newx;i>=0;i--) { 51 if(g[i][newy]==‘\\‘) { 52 flag=true; 53 if(newy-1<0) return -1; 54 newx=i; 55 newy--; 56 op=4; //---->left 57 break; 58 } else if(g[i][newy]==‘/‘) { 59 flag=true; 60 if(newy+1==m) return -1; 61 newx=i; 62 newy++; 63 op=2; //--->right 64 break; 65 } 66 } 67 if(!flag) return -1; 68 } else { //left 69 for(int i=newy;i>=0;i--) { 70 if(g[newx][i]==‘\\‘) { 71 flag=true; 72 if(newx-1<0) return -1; 73 newx--; 74 newy=i; 75 op=3; //---->up 76 break; 77 } else if(g[newx][i]==‘/‘) { 78 flag=true; 79 if(newx+1==n) return i; 80 newx++; 81 newy=i; 82 op=1; //---->down 83 break; 84 } 85 } 86 if(!flag) return -1; 87 } 88 } 89 } 90 91 int main() { 92 scanf("%d%d",&n,&m); 93 for(int i=0;i<n;i++) scanf("%s",g[i]); 94 for(int i=0;i<m;i++) { 95 ans[i]=work(0,i); 96 } 97 for(int i=0;i<m;i++) printf("%d\n",ans[i]==-1?-1:ans[i]+1); 98 return 0; 99 }
牛客寒假算法基礎集訓營5 I 炫酷鏡子