网格反射 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 }

 

转载于:https://www.cnblogs.com/nuoyan2010/archive/2013/04/08/3008723.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值