zoukankan      html  css  js  c++  java
  • 【模拟7.22】光(模拟)

    一道非常考验码力的题,快崩溃了,码了一晚上,刚想着再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
    ",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
    ",*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
    ",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
    ",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
    ",nxt_x,nxt_y);
    135             if(bian[find1(x,y)][5-fir]==0)ans+=abs(nxt_x-x);
    136             //printf("ans=%lld
    ",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
    ",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
    ",bian[find1(x,y)][5-fir]);
    168             if(bian[find1(x,y)][5-fir]==0)ans+=abs(nxt_x-x);
    169             //printf("nn=%lld
    ",nxt_x);
    170             //printf("ans=%lld
    ",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
    ",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
    ",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
    ",x,y);/
    253             if(tiao==1)xxx=x,yyy=y;
    254         }
    255         //printf("ans===%lld
    ",ans);
    256         if(pan==1)break;
    257     }
    258     printf("%lld
    ",ans);   
    259     return 0;
    260 }
    261 /*
    262 7 5 3
    263 3 3
    264 4 3
    265 5 3
    266 6 4 SW
    267 */
    两百行....不说啥了
  • 相关阅读:
    java中Map遍历的四种方式
    Java从网络读取图片并保存至本地
    spring整合问题分析之Write operations are not allowed in readonly mode (FlushMode.MANUAL): Turn your Session into FlushMode.COMMIT/AUTO or remove 'readOnly' marker from transaction definition.
    element 中table表格多选,翻页或者切换不同数据后保存之前选择的数据并返显选中的状态
    nvm的安装与使用(Mac 版)
    常用正则表达式
    uniapp开发微信小程序
    关于elementui select组件change事件只要数据变化就会触发的解决办法
    elementui的表单重置方法resetFields()的坑
    Element中vfor动态数据循环表单验证的处理
  • 原文地址:https://www.cnblogs.com/Wwb123/p/11234699.html
Copyright © 2011-2022 走看看