牛客寒假算法基础集训营5 I 炫酷镜子
链接: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(int i=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 } else if(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 }