zoukankan      html  css  js  c++  java
  • 网格反射 codeforces 249D

    看原理的话  到这位大哥的博客  深有体会。。

    http://blog.csdn.net/haha593572013/article/details/8770423

    如果碰到网格边界的次数大于n+m-2,那么就能够形成一个完整的棋盘。

    View Code
      1 #include<iostream>
      2 #include<cstdio>
      3 #include<cstdlib>
      4 #include<cstring>
      5 #include<queue>
      6 using std::queue;
      7 using std::min;
      8 int const N = 102000;
      9 int n,m,vis[N][4][4],Re[N][4],Count;
     10 __int64 step;
     11 struct node
     12 {
     13        int x,y,dir;
     14 }cur;
     15 queue<node> Q;
     16 char tmp[5];
     17 int dx[]={-1,-1,1,1};
     18 int dy[]={-1,1,1,-1};
     19 int main()
     20 {
     21     while(~scanf("%d %d",&n,&m))
     22     {
     23           scanf("%d %d",&cur.x,&cur.y);
     24           scanf("%s",tmp);
     25           while(!Q.empty())Q.pop();
     26           if(tmp[0]=='U')
     27              if(tmp[1]=='R')cur.dir=1;
     28              else cur.dir=0;
     29           if(tmp[0]=='D')
     30              if(tmp[1]=='R')cur.dir=2;
     31              else cur.dir=3;
     32 
     33           Q.push(cur);
     34 
     35           memset(vis,0,sizeof(vis));
     36           memset(Re,0,sizeof(Re));
     37           Count=0;
     38 
     39           if(cur.x==1)vis[cur.y][0][cur.dir]=1,Re[cur.y][0]=1,Count=1;
     40           else if(cur.x==n)vis[cur.y][1][cur.dir]=1,Re[cur.y][1]=1,Count=1;
     41 
     42           if(cur.y==1)vis[cur.x][2][cur.dir]=1,Re[cur.x][2]=1,Count=1;
     43           else if(cur.y==m)vis[cur.x][3][cur.dir]=1,Re[cur.x][3]=1,Count=1;
     44 
     45           step=1;
     46           int flag=0;
     47 
     48           while(!Q.empty())
     49           {
     50                 cur=Q.front();
     51                 Q.pop();
     52                 if(cur.dir==0)
     53                 {
     54                    int ff=min(cur.x-1,cur.y-1);
     55                    if(ff==0)
     56                    {
     57                       if(cur.x==1&&cur.y==1)cur.dir=2;
     58                       else
     59                         if(cur.x==1)cur.dir=3;
     60                         else cur.dir=1;
     61                       Q.push(cur);
     62                       continue;
     63                    }
     64                    cur.x-=ff;
     65                    cur.y-=ff;
     66                    step+=ff;
     67                    int inc=0;
     68                    if(cur.x==1)
     69                    {
     70                        if(vis[cur.y][0][cur.dir])flag=1;
     71                        else vis[cur.y][0][cur.dir]=1;
     72                        if(!Re[cur.y][0])Re[cur.y][0]=1,inc=1;
     73                    }
     74                    if(cur.y==1)
     75                    {
     76                        if(vis[cur.x][2][cur.dir])flag=1;
     77                        else vis[cur.x][2][cur.dir]=1;
     78                        if(!Re[cur.x][2])Re[cur.x][2]=1,inc=1;
     79                    }
     80                    if(cur.x==1&&cur.y==1)cur.dir=2;
     81                    else
     82                      if(cur.x==1)cur.dir=3;
     83                      else cur.dir=1;
     84                    if(!flag)Q.push(cur),Count+=inc;
     85                 }
     86                 else
     87                   if(cur.dir==1)
     88                   {
     89                      int ff=min(cur.x-1,m-cur.y);
     90                      if(ff==0)
     91                      {
     92                         if(cur.x==1&&cur.y==m)cur.dir=3;
     93                         else
     94                           if(cur.x==1)cur.dir=2;
     95                           else cur.dir=0;
     96                         Q.push(cur);
     97                         continue;
     98                      }
     99                      step+=ff;
    100                      cur.x-=ff;
    101                      cur.y+=ff;
    102                      int inc=0;
    103                      if(cur.x==1)
    104                      {
    105                          if(vis[cur.y][0][cur.dir])flag=1;
    106                          else vis[cur.y][0][cur.dir]=1;
    107                          if(!Re[cur.y][0])Re[cur.y][0]=1,inc=1;
    108                      }
    109                      if(cur.y==m)
    110                      {
    111                          if(vis[cur.x][3][cur.dir])flag=1;
    112                          else vis[cur.x][3][cur.dir]=1;
    113                          if(!Re[cur.x][3])Re[cur.x][3]=1,inc=1;
    114                      }
    115                      if(cur.x==1&&cur.y==m)cur.dir=3;
    116                      else
    117                        if(cur.x==1)cur.dir=2;
    118                        else cur.dir=0;
    119                      if(!flag)Q.push(cur),Count+=inc;
    120                   }
    121                   else
    122                     if(cur.dir==2)
    123                     {
    124                        int ff=min(n-cur.x,m-cur.y);
    125                        if(ff==0)
    126                        {
    127                           if(cur.x==n&&cur.y==m)cur.dir=0;
    128                           else
    129                             if(cur.x==n)cur.dir=1;
    130                             else cur.dir=3;
    131                           Q.push(cur);
    132                           continue;
    133                        }
    134                        step+=ff;
    135                        cur.x+=ff;
    136                        cur.y+=ff;
    137                        int inc=0;
    138                        if(cur.x==n)
    139                        {
    140                           if(vis[cur.y][1][cur.dir])flag=1;
    141                           else vis[cur.y][1][cur.dir]=1;
    142                           if(!Re[cur.y][1])Re[cur.y][1]=1,inc=1;
    143                        }
    144                        if(cur.y==m)
    145                        {
    146                           if(vis[cur.x][3][cur.dir])flag=1;
    147                           else vis[cur.x][3][cur.dir]=1;
    148                           if(!Re[cur.x][3])Re[cur.x][3]=1,inc=1;
    149                        }
    150                        if(cur.x==n&&cur.y==m)cur.dir=0;
    151                        else
    152                          if(cur.x==n)cur.dir=1;
    153                          else cur.dir=3;
    154                        if(!flag)Q.push(cur),Count+=inc;
    155                     }
    156                     else
    157                       if(cur.dir==3)
    158                       {
    159                          int ff=min(n-cur.x,cur.y-1);
    160                          if(ff==0)
    161                          {
    162                             if(cur.x==n&&cur.y==1)cur.dir=1;
    163                             else
    164                               if(cur.x==n)cur.dir=0;
    165                               else cur.dir=2;
    166                             Q.push(cur);
    167                             continue;
    168                          }
    169                          step+=ff;
    170                          cur.x+=ff;
    171                          cur.y-=ff;
    172                          int inc=0;
    173                          if(cur.x==n)
    174                          {
    175                             if(vis[cur.y][1][cur.dir])flag=1;
    176                             else vis[cur.y][1][cur.dir]=1;
    177                             if(!Re[cur.y][1])Re[cur.y][1]=1,inc=1;
    178                          }
    179                          if(cur.y==1)
    180                          {
    181                             if(vis[cur.x][2][cur.dir])flag=1;
    182                             else vis[cur.x][2][cur.dir]=1;
    183                             if(!Re[cur.x][2])Re[cur.x][2]=1,inc=1;
    184                          }
    185                          if(cur.x==n&&cur.y==1)cur.dir=1;
    186                          else
    187                            if(cur.x==n)cur.dir=0;
    188                            else cur.dir=2;
    189                          if(!flag)Q.push(cur),Count+=inc;
    190                       }
    191                 if(Count>=n+m-2)break;
    192                 if(flag)break;
    193           }
    194 
    195           if(flag)printf("-1\n");
    196           else printf("%I64d\n",step);
    197     }
    198     return 0;
    199 }
  • 相关阅读:
    js 正则验证输入框只允许输入正实数和正整数和负整数
    阿里maven镜像服务器配置
    JDK环境变量配置
    AndroidStudio OpenCv的配置,不用安装opencv manager
    Java实现红黑树
    基于红黑树的骨架提取Java
    基于Mat变换的骨架提取Java
    Java实现二叉树的四种遍历
    Java实现常见的几种排序
    hough变换检测直线Java
  • 原文地址:https://www.cnblogs.com/nuoyan2010/p/3008723.html
Copyright © 2011-2022 走看看