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