光(模拟)

一道非常考验码力的题,快崩溃了,码了一晚上,刚想着再A不掉就弃了,离下课还剩三分钟突然A掉了,

考试时码了两百行大模拟,因为统计答案错了导致WA0,考完一改就60...........

推荐阅读同机房大佬WD的博客

自己没啥可讲的,主要是学了学set的用法,set可以支持lower_bound操作,

然后各种转向,判断.........我就不细说了

还有统计开始的起点的光线长度时我没想好怎么处理,于是我先让光线射一次,让它到达边缘,

让这条边标记为-1(为了使它重复经过),然后还有ans=-1;为了排除到达点的影响(可能有点乱,还是看代码吧)。

考试代码(60分)

  1 #include<iostream>
  2 #include<cstdio>
  3 #include<cstring>
  4 #include<string>
  5 #include<algorithm>
  6 #include<cmath>
  7 #include<stack>
  8 #include<vector>
  9 #include<queue>
 10 #define MAXN 5101
 11 #define ps push_back
 12 #define ll long long
 13 using namespace std;
 14 int bian[MAXN*MAXN];
 15 int ans;int n,m,p;
 16 struct node{int l;int r;int data;int lazy;}e[MAXN*MAXN];
 17 int pan_quan(int x,int dir)
 18 {
 19     if(dir==1)//向右下
 20     {
 21         if(e[x+1].lazy==1&&e[x+m].lazy==1&&e[x+m+1].lazy==1)
 22         {
 23            return 1;
 24         }
 25         else if(e[x+m+1].lazy==1)
 26         {
 27             if(e[x+1].lazy==0&&e[x+m].lazy==0)
 28             {
 29                 return 1;
 30             }
 31         }
 32         return 0;
 33     }
 34     else if(dir==4)//向左上
 35     {
 36         if(e[x-1].lazy==1&&e[x-m].lazy==1&&e[x-m-1].lazy==1)
 37         {
 38            return 1;
 39         }
 40         else if(e[x-m-1].lazy==1)
 41         {
 42            if(e[x-1].lazy==0&&e[x-m].lazy==0)
 43            {
 44                 return 1;
 45            }
 46         }
 47         return 0;
 48     }
 49     else if(dir==2)//向左下
 50     {
 51         if(e[x-1].lazy==1&&e[x-1+m].lazy==1&&e[x+m].lazy==1)
 52         {
 53            return 1;
 54         }
 55         else if(e[x+m-1].lazy==1)
 56         {
 57              if(e[x-1].lazy==0&&e[x+m].lazy==0)
 58              {
 59                  return 1;
 60              }
 61         }
 62         return 0;
 63     }
 64     else if(dir==3)//向右上
 65     {
 66         if(e[x+1].lazy==1&&e[x+1-m].lazy==1&&e[x-m].lazy==1)
 67         {
 68            return 1;
 69         }
 70         else if(e[x+1-m].lazy==1)
 71         {
 72              if(e[x+1].lazy==0&&e[x-m].lazy==0)
 73              {
 74                  return 1;
 75              }
 76         }
 77         return 0;
 78     }
 79 }
 80 int th=0;int ta=0;
 81 int pan_hang(int x,int dir)
 82 {
 83     th=0;ta=0;
 84     if(dir==1)//向右下
 85     {
 86         if(e[x+m].lazy==1&&e[x+m+1].lazy==1)
 87         {
 88            th=x+1;ta=3;
 89            return x+1;
 90         }
 91         return 0;
 92     }
 93     else if(dir==4)//向左上
 94     {
 95         if(e[x-m].lazy==1&&e[x-m-1].lazy==1)
 96         {
 97            th=x-1;ta=2;
 98            return x-1;
 99         }
100         return 0;
101     }
102     else if(dir==2)//向左下
103     {
104         if(e[x-1+m].lazy==1&&e[x+m].lazy==1)
105         {
106            th=x-1;ta=4;
107            return x-1;
108         }
109         return 0;
110     }
111     else if(dir==3)//向右上
112     {
113         if(e[x+1-m].lazy==1&&e[x-m].lazy==1)
114         {
115            th=x+1;ta=1;
116            return x+1;
117         }
118         return 0;
119     }
120 }
121 int pan_lie(int x,int dir)
122 {
123     th=0;ta=0;
124     if(dir==1)//向右下
125     {
126         if(e[x+1].lazy==1&&e[x+m+1].lazy==1)
127         {
128            th=x+m;ta=2;
129            return 1;
130         }
131         return 0;
132     }
133     else if(dir==4)//向左上
134     {
135         if(e[x-1].lazy==1&&e[x-m-1].lazy==1)
136         {
137            th=x-m;ta=3;
138            return 1;
139         }
140         return 0;
141     }
142     else if(dir==2)//向左下
143     {
144         if(e[x-1+m].lazy==1&&e[x-1].lazy==1)
145         {
146            th=x+m;ta=1;
147            return 1;
148         }
149         return 0;
150     }
151     else if(dir==3)//向右上
152     {
153         if(e[x+1-m].lazy==1&&e[x+1].lazy==1)
154         {
155            th=x-m;ta=4;
156            return 1;
157         }
158         return 0;
159     }
160 }
161 void DFS(int x,int dir,int l,int r)
162 {
163     if(bian[x]==3)
164     {
165         return ;
166     }
167     bian[x]++;
168     if(pan_quan(x,dir)==1)
169     {
170         if(bian[x]==1)ans++;
171         DFS(x,5-dir,l,r);
172     }
173     else if(pan_hang(x,dir)!=0)
174     {
175         if(bian[x]==1)ans++;
176         DFS(th,ta,e[th].l,e[th].r);
177     }
178     else if(pan_lie(x,dir)!=0)
179     {
180         if(bian[x]==1)ans++;
181         DFS(th,ta,e[th].l,e[th].r);
182     }
183     else
184     {
185         if(dir==1)x+=m+1;
186         if(dir==4)x-=m+1;
187         if(dir==2)x=x-1+m;
188         if(dir==3)x=x-m+1;
189         if(bian[x]==1)ans++;
190         DFS(x,dir,e[x].l,e[x].r);
191     }
192     return ;
193 }
194 int kuan[MAXN][MAXN];
195 int main()
196 {
197    scanf("%d%d%d",&n,&m,&p);
198    for(int i=1;i<=p;++i)
199    {
200       int x,y;
201       scanf("%d%d",&x,&y);
202       kuan[x][y]=1;
203    }
204    int xx,yy;
205    scanf("%d%d",&xx,&yy);
206    string s;
207    cin>>s;
208    int fir=0,root;
209    for(int i=0;i<=n+1;++i)
210    {
211        for(int j=0;j<=m+1;++j)
212        {
213            int da=(i*(m+2)+j+1);
214            e[da].data=da;
215            e[da].l=i;e[da].r=j;
216            e[da].lazy=kuan[i][j];
217            if(i==0||i==n+1||j==0||j==m+1)
218            {
219               e[da].lazy=1;
220            }
221            if(i==xx&&j==yy)
222            {
223               root=da;
224            }
225        }
226    }
227    n+=2;m+=2;
228    if(s[0]==‘N‘&&s[1]==‘E‘)fir=3;
229    else if(s[0]==‘N‘&&s[1]==‘W‘)fir=1;
230    else if(s[0]==‘S‘&&s[1]==‘E‘)fir=4;
231    else if(s[0]==‘S‘&&s[1]==‘W‘)fir=2;
232    DFS(root,fir,e[root].l,e[root].r);
233    printf("%d\n",ans);
234 }

200行大码量

AC代码

  1 #include<iostream>
  2 #include<cstdio>
  3 #include<cstring>
  4 #include<string>
  5 #include<algorithm>
  6 #include<cmath>
  7 #include<stack>
  8 #include<vector>
  9 #include<queue>
 10 #include<set>
 11 #include<map>
 12 #define MAXN 1000001
 13 #define ps push_back
 14 #define ll long long
 15 using namespace std;
 16 ll n,m,k,ch,fir;ll bian[MAXN][5];
 17 ll x,y;
 18 map<pair<ll,ll>,bool>h;
 19 set<ll>v1[MAXN];set<ll>v2[MAXN];//1:左上(1)右下(4)x+y定值 2:左下(2)右上(3)x-y+m定值
 20 ll find_qian1(ll k,ll x)//4 右下
 21 {
 22     set<ll>::iterator it;it=v1[k].lower_bound(x);return *it;
 23 }
 24 ll find_hou1(ll k,ll x)//1 左上
 25 {
 26     set<ll>::iterator it;it=v1[k].lower_bound(x);;it--;return *it;//printf("it=%lld\n",*it);
 27 }
 28 ll find_qian2(ll k,ll x)//3 右上
 29 {
 30     set<ll>::iterator it;it=v2[k].lower_bound(x);it--;return *it;
 31 }
 32 ll find_hou2(ll k,ll x)//2 左下
 33 {
 34     set<ll>::iterator it;it=v2[k].lower_bound(x);return *it;
 35 }
 36 ll find1(ll x,ll y)
 37 {
 38     return x-y+ch;
 39 }
 40 ll find2(ll x,ll y)
 41 {
 42     return x+y;
 43 }
 44 ll nxt;ll ans=0;ll xxx=0,yyy=0;
 45 map<pair<ll,ll>,bool>star;ll bbb=0;
 46 int main()
 47 {
 48     scanf("%lld%lld%lld",&n,&m,&k);
 49     ch=m+n+2;
 50     for(ll i=1;i<=k;++i)
 51     {
 52         ll x,y;
 53         scanf("%lld%lld",&x,&y);
 54         v1[find1(x,y)].insert(x);     v2[find2(x,y)].insert(x);
 55         h[make_pair(x,y)]=1;
 56     }
 57     for(ll i=0;i<=n+1;++i)
 58     {
 59         v1[find1(i,0)].insert(i);     v2[find2(i,0)].insert(i);
 60         v1[find1(i,m+1)].insert(i);   v2[find2(i,m+1)].insert(i);
 61         h[make_pair(i,0)]=1;          h[make_pair(i,m+1)]=1;
 62     }
 63     for(ll j=1;j<=m;++j)
 64     {
 65         v1[find1(0,j)].insert(0);     v2[find2(0,j)].insert(0);
 66         v1[find1(n+1,j)].insert(n+1); v2[find2(n+1,j)].insert(n+1);
 67         h[make_pair(0,j)]=1;          h[make_pair(n+1,j)]=1;
 68     }
 69     scanf("%lld%lld",&x,&y);
 70     string s;cin>>s;
 71     if(s[0]==‘N‘&&s[1]==‘E‘)fir=3;
 72     else if(s[0]==‘N‘&&s[1]==‘W‘)fir=4;
 73     else if(s[0]==‘S‘&&s[1]==‘E‘)fir=1;
 74     else if(s[0]==‘S‘&&s[1]==‘W‘)fir=2;
 75     if(fir==1)
 76     {
 77          nxt=find_hou1(find1(x,y),x);
 78          ans-=1;//abs(nxt-x);
 79          nxt++;//向左移
 80          y=nxt-x+y;x=nxt;
 81          bian[find1(x,y)][fir]=-1;
 82          //xxx=x;yyy=y;
 83     }
 84     else if(fir==4)
 85     {
 86          nxt=find_qian1(find1(x,y),x);
 87          ans-=1;//abs(nxt-x);
 88          nxt--;
 89          y=nxt-x+y;x=nxt;
 90          bian[find1(x,y)][fir]=-1;
 91          //xxx=x;yyy=y;
 92     }
 93     else if(fir==2)
 94     {
 95          nxt=find_hou2(find2(x,y),x);
 96          ans-=1;//abs(nxt-x);
 97          nxt--;
 98          y=x+y-nxt;x=nxt;
 99          bian[find2(x,y)][fir]=-1;
100          //xxx=x;yyy=y;
101     }
102     else if(fir==3)
103     {
104          nxt=find_qian2(find2(x,y),x);
105          ans-=1;//abs(nxt-x);
106          nxt++;
107          y=x+y-nxt;x=nxt;
108          bian[find2(x,y)][fir]=-1;
109          //xxx=x;yyy=y;
110     }
111     ll tiao=0;bool pan=0;
112     //printf("x=%lld y=%lld fir=%lld\n",x,y,fir);
113     while(1)//1:左上(1)右下(4)x+y定值      2:左下(2)右上(3)x-y+m定值
114     {
115         ++tiao;
116         //if(tiao<=20)
117         //printf("x===%lld y===%lld fir===%lld\n",x,y,fir);
118         /*if(tiao>2)
119         {
120             if(x==xxx&&y==yyy)
121             {
122                 pan=1;break;
123             }
124         } */
125         if(fir==1)
126         {
127             if(pan==1)break;
128             if(bian[find1(x,y)][fir]>=1){pan=1;break;}
129             nxt=find_hou1(find1(x,y),x);
130             //ll nxt_x=nxt,nxt_y=x+y-nxt_x;
131             ll nxt_x=nxt,nxt_y=nxt_x-x+y;
132             bian[find1(x,y)][fir]++;
133             //cout<<bian[find1(x,y)][fir]<<endl;
134             //printf("xxx%lld yyy%lld\n",nxt_x,nxt_y);
135             if(bian[find1(x,y)][5-fir]==0)ans+=abs(nxt_x-x);
136             //printf("ans=%lld\n",ans);
137             if(h[make_pair(nxt_x+1,nxt_y)]&&h[make_pair(nxt_x,nxt_y+1)])
138             {
139                 fir=5-fir;
140                 x=nxt_x+1;y=nxt_y+1;
141             }
142             else if(h[make_pair(nxt_x+1,nxt_y)])
143             {
144                 fir=3;
145                 x=nxt_x;y=nxt_y+1;
146             }
147             else if(h[make_pair(nxt_x,nxt_y+1)])
148             {
149                 fir=2;
150                 x=nxt_x+1;y=nxt_y;
151             }
152             else
153             {
154                 fir=5-fir;
155                 x=nxt_x+1;y=nxt_y+1;
156             }
157             if(tiao==1)xxx=x,yyy=y;
158             //printf("修改x===%lld y==%lld fir==%lld\n",x,y,fir);
159         }
160         else if(fir==4)
161         {
162             if(pan==1)break;
163             if(bian[find1(x,y)][fir]>=1){pan=1;break;}
164             nxt=find_qian1(find1(x,y),x);
165             ll nxt_x=nxt,nxt_y=nxt_x-x+y;
166             bian[find1(x,y)][fir]++;
167             //printf("%lld\n",bian[find1(x,y)][5-fir]);
168             if(bian[find1(x,y)][5-fir]==0)ans+=abs(nxt_x-x);
169             //printf("nn=%lld\n",nxt_x);
170             //printf("ans=%lld\n",ans);
171             if(h[make_pair(nxt_x-1,nxt_y)]&&h[make_pair(nxt_x,nxt_y-1)])
172             {
173                 fir=5-fir;
174                 x=nxt_x-1;y=nxt_y-1;
175             }
176             else if(h[make_pair(nxt_x-1,nxt_y)])
177             {
178                 fir=2;
179                 x=nxt_x;y=nxt_y-1;
180             }
181             else if(h[make_pair(nxt_x,nxt_y-1)])
182             {
183                 fir=3;
184                 x=nxt_x-1;y=nxt_y;
185             }
186             else
187             {
188                 fir=5-fir;
189                 x=nxt_x-1;y=nxt_y-1;
190             }
191             if(tiao==1)xxx=x,yyy=y;
192         }
193         else if(fir==2)//2:左下(2)右上(3)x-y+m定值
194         {
195             if(pan==1)break;
196             if(bian[find2(x,y)][fir]>=1){pan=1;break;}
197             nxt=find_hou2(find2(x,y),x);
198             ll nxt_x=nxt,nxt_y=x+y-nxt_x;
199             bian[find2(x,y)][fir]++;
200             if(bian[find2(x,y)][5-fir]==0)ans+=abs(nxt_x-x);
201             if(h[make_pair(nxt_x-1,nxt_y)]&&h[make_pair(nxt_x,nxt_y+1)])
202             {
203                 fir=5-fir;
204                 x=nxt_x-1;y=nxt_y+1;
205             }
206             else if(h[make_pair(nxt_x-1,nxt_y)])
207             {
208                 fir=4;
209                 x=nxt_x;y=nxt_y+1;
210             }
211             else if(h[make_pair(nxt_x,nxt_y+1)])
212             {
213                 fir=1;
214                 x=nxt_x-1;y=nxt_y;
215             }
216             else
217             {
218                 fir=5-fir;
219                 x=nxt_x-1;y=nxt_y+1;
220             }
221             if(tiao==1)xxx=x,yyy=y;
222         }
223         else if(fir==3)
224         {
225             if(pan==1)break;
226             if(bian[find2(x,y)][fir]>=1){pan=1;break;}
227             nxt=find_qian2(find2(x,y),x);
228             ll nxt_x=nxt,nxt_y=x+y-nxt_x;
229             //printf("nxt=%lld nxt=%lld\n",nxt_x,nxt_y);
230             bian[find2(x,y)][fir]++;
231             if(bian[find2(x,y)][5-fir]==0)ans+=abs(nxt_x-x);
232             //printf("ans=%lld\n",ans);
233             if(h[make_pair(nxt_x+1,nxt_y)]&&h[make_pair(nxt_x,nxt_y-1)])
234             {
235                 fir=5-fir;
236                 x=nxt_x+1;y=nxt_y-1;
237             }
238             else if(h[make_pair(nxt_x+1,nxt_y)])
239             {
240                 fir=1;
241                 x=nxt_x;y=nxt_y-1;
242             }
243             else if(h[make_pair(nxt_x,nxt_y-1)])
244             {
245                 fir=4;
246                 x=nxt_x+1;y=nxt_y;
247             }
248             else
249             {
250                 fir=5-fir;
251                 x=nxt_x+1;y=nxt_y-1;
252             }//printf("gaix=%lld y=%lld\n",x,y);/
253             if(tiao==1)xxx=x,yyy=y;
254         }
255         //printf("ans===%lld\n",ans);
256         if(pan==1)break;
257     }
258     printf("%lld\n",ans);
259     return 0;
260 }
261 /*
262 7 5 3
263 3 3
264 4 3
265 5 3
266 6 4 SW
267 */

两百行....不说啥了

原文地址:https://www.cnblogs.com/Wwb123/p/11234699.html

时间: 2024-11-10 15:34:34

光(模拟)的相关文章

Unity3d 经验小结

Unity3d 经验小结 文本教程 你是第2541个围观者 0条评论 供稿者:Jamesgary 标签:unity3d教程 Fbx.贴图导入Unity时的注意事项: 在导出Fbx之前,Maya中已经对物体连接了正确的贴图,并且贴图文件名不能更改. 把Fbx和贴图放在同一文件夹内,直接把此文件加拖入Unity内.此时Diffuse贴图应能自动识别. 此时,对贴图修改后,在Unity中更新贴图(删除老贴图,导入新贴图,并保持命名,路经一致),模型能够自动更新. 假如Unity中删除贴图,关闭Unit

光照演示程序(第八章内容)

光照演示程序(第八章内容) 8.14.光照演示程序 本章演示程序基于上一章的"陆地与波浪演示程序"的基础上构建而成的,其中利用了一个方向光来表示太阳,用户可以使用方向键来控制太阳的方向. 8.14.1.顶点格式 光照的计算需要依赖于表面法线,所以我们会在顶点层级定义法线,方便在光栅化过程中进行插值计算,由此展开逐像素光照.同时我们也不需要指定顶点的颜色,而是以每一个像素应用光照方程之后所生成的像素颜色代替指定顶点颜色.下面是顶点结构体: //c++顶点结构体 struct Vertex

CCF虚拟现实与可视化技术专委会丨面向增强现实的可视计算技术研究进展概述

https://mp.weixin.qq.com/s/I-rNwgXHEtwgdpkWzKtVXw 摘要 新一代增强现实技术需要依赖可视计算理论与方法解决大尺度复杂环境下的场景建模.内容生成.感知交互三个关键科学问题.本文从以上三个方面,介绍了面向增强现实的可视计算技术的主要研究进展.其中,场景建模主要涉及复杂场景定位.重建与建模,包括同时定位与地图构建.场景几何与材质精确重建与数字化.实时高质量动态环境重建等:内容生成主要涉及视觉一致性驱动的高逼真度虚实融合,包括场景渲染参数估计.虚拟物体嵌入

【BZOJ4524】[Cqoi2016]伪光滑数 堆(模拟搜索)

[BZOJ4524][Cqoi2016]伪光滑数 Description 若一个大于1的整数M的质因数分解有k项,其最大的质因子为Ak,并且满足Ak^K<=N,Ak<128,我们就称整数M为N-伪光滑数.现在给出N,求所有整数中,第K大的N-伪光滑数. Input 只有一行,为用空格隔开的整数N和K 2 ≤ N ≤ 10^18, 1 ≤ K ≤ 800000,保证至少有 K 个满足要求的数 Output 只有一行,为一个整数,表示答案. Sample Input 12345 20 Sample

光车间一期模拟试题

[注意事项] 1 所有文件名,输入输出名都必须是小写字母: 2 主函数返回值类型必须是int类型,返回值必须是0: 3 保存名称为题目名.cpp 如:relay.cpp 4 运行内存上限50m Debug->Debugging windows->Examing memory,弹出Memory窗口,即可查看内存 CodeClub一期模拟题时间:120min 走楼梯 stair.cpp [问题描述] 一个楼梯有n级,小苏同学从下往上走,一部可以跨一级,也可以跨两级.问:他走到第N级楼梯应该有几种走

【BZOJ3502/2288】PA2012 Tanie linie/【POJ Challenge】生日礼物 堆+链表(模拟费用流)

[BZOJ3502]PA2012 Tanie linie Description n个数字,求不相交的总和最大的最多k个连续子序列. 1<= k<= N<= 1000000. Sample Input 5 2 7 -3 4 -9 5 Sample Output 13 题解:跟1150和2151差不多. 我们先做一些预处理,因为连续的正数和连续的负数一定是要么都选要么都不选,所以可以将它们合并成一个数,同时区间中的零以及左右两端的负数没有意义,可以将它们删掉.然后我们得到的序列就变成:正-

Unity3D ShaderLab BRDF模拟

在上一篇,说到了使用渐变纹理着色,使用一个值来控制纹理的uv坐标,但是这也就表示我们只能得到一个线性的光照效果. 那么我们能不能通过观察方向的向量结合光照方向形成双向的反射变化呢,既然说到这里,肯定是可以做到的, 这就是我们的BRDF effect,我们可以简单的把BRDF看作为入射光在不透明物体表面同时反射到观察方向和出射光方向. BRDF(Bidirectional Reflectance Distribution Function具体的内容讲解,可以查阅百度百科. 光线照到一个物体,首先产

模拟试题B

模拟试题B 一.单项选择题(2′*8 =16′) 1.灰度等级为256级,分辨率为2048*1024的显示器,至少需要的帧缓存容量为( ) A)512KB B)1MB C)2MB D)3MB 2.在多形边面片的数量非常大的情况下,哪一个消隐算法速度最快? ( ) A)深度缓存算法(Z-Buffer) B)光线跟踪算法 C)画家算法 D)不确定 3.双线性光强插值法(Gouraud Shading)存在哪些问题?( ) A)光照强度在数值上不连续 B)生成多面体真实感图形效果差 C)生成曲面体真实

Bragg光栅原理为基础建立的一款光纤设备模拟及优化软件Apollo.Photonics.Fogs.BG.v3.2 1CD

RSoft Photonics CAD Suite v7.1-ISO 1CD(光子晶体仿真软件) BandSOLVE.v3.0.0 1CD BeamPROP.v7.0.2.0.1 1CD DiffractMOD.2.0.2.0.1 1CD FemSIM v2.0.2.0.1 1CD FullWAVE.v5.0.2.0.1 1CD GratingMOD v2.0.2.0.1 1CD LaserMOD v2.2.2.2 1CD RScript v1.0 1CD RSoft DataBROWER v3