光(模拟)

一道非常考验码力的题,快崩溃了,码了一晚上,刚想着再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 */
两百行....不说啥了

猜你喜欢

转载自www.cnblogs.com/Wwb123/p/11234699.html