解题思路:
对于任意一个给定的房间,以下图中第2栋楼的202室为例,在太阳位于正上方的时候肯定可以完全被阳光照射。在这之前有一一个刚开始被照射的最小角度,最小角度取决于这栋楼左边的楼房对太阳光的遮挡。对左边的楼房一栋一栋地检查,以右上角的顶点为基准,连一条:线到所求房间的左下角,求这条线的倾斜角。倾斜角最大的线就是使得所求房间刚开始被太阳
光照射到的最小角度。同理,在这之后有一个刚结束被照射的最大角度,最大角度取决于右边的楼房对太阳光的遮挡。同样对右边的楼房一栋一 栋地检查,以左上角的顶点为基准,连一条线到所求房间的右下角,求这条线的倾斜角。倾斜角最小的线就是使得所求房间刚结束被太阳光照射到的最大角度,如图所示。最后将这两个角度转化成时间并输出
注意事项:
参考代码:
#include<cstdio> #include<math.h> int n,h[111],d[111],width,height,sum,i,di,num,level,id; int cases,dh,dw,h1,m1,h2,m2; double min,max,angle,Half_pi;//min和max向下取整对应的开始时间和结束时间的秒,half_Pi为π/2 angle存储照射角 int main() { Half_pi=acos(0); while(scanf("%d",&n) && n) { scanf("%d%d",&width,&height); sum=0; for(i=0;i<n;i++) { scanf("%d",&h[i]); d[i]=sum; if(i<n-1) { scanf("%d",&di); sum+=di+width; } } int flag=1; //printf("Apartment Complex: %d\n",++cases); while(scanf("%d",&num)&&num) { if(flag==1) { printf("Apartment Complex: %d\n",++cases); flag=0; } printf("Apartment %d: ",num); level=num/100-1; id=num%100-1; if(id<0 || id>=n || level<0 || level>=h[id]) { puts("Dose not exist"); continue; } min=0; max=0; for(i=0;i<id;i++) { dw=d[id]-d[i]-width; dh=height*(h[i]-level); if(dh>0) { angle=asin(dh/sqrt(dh*dh+dw*dw)); if(angle>min) { min=angle; } } } for(i=id+1;i<n;i++) { dw=d[i]-d[id]-width; dh=height*(h[i]-level); if(dh>0) { angle=asin(dh/sqrt(dh*dh+dw*dw)); if(angle>max) { max=angle; } } } min=20220+22800*min/Half_pi; max=65820-22800*max/Half_pi; h1=int(min/3600); min-=h1*3600; m1=int(min/60); min-=m1*60; h2=int(max/3600); max-=h2*3600; m2=int(max/60); max-=m2*60; printf("%02d:%02d:%02d-%02d:%02d:%02d\n",h1,m1,int(min),h2,m2,int(max)); } } return 0; }
0.0分
1 人评分
C语言程序设计教程(第三版)课后习题6.1 (C语言代码)浏览:641 |
C语言程序设计教程(第三版)课后习题7.1 (C语言代码)浏览:1267 |
C语言程序设计教程(第三版)课后习题6.3 (C++代码)浏览:1068 |
C语言程序设计教程(第三版)课后习题9.8 (C语言代码)浏览:646 |
C语言程序设计教程(第三版)课后习题9.2 (C语言代码)浏览:573 |
C语言程序设计教程(第三版)课后习题11.1 (C语言代码)浏览:651 |
1009题解浏览:802 |
1128题解(返回值为数组的情况)浏览:571 |
C语言训练-亲密数 (C语言描述,反正怎么都能对)浏览:2256 |
C二级辅导-计负均正 (C语言代码)浏览:523 |