一道非常考验码力的题,快崩溃了,码了一晚上,刚想着再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 */
两百行....不说啥了
原文地址:https://www.cnblogs.com/Wwb123/p/11234699.html
时间: 2024-11-10 15:34:34