模拟题 Right turn SCU - 4445
用一个二维数组记录从四个方向到达该障碍物的次数,如果同一个方向到达该障碍物两次,那么就一定可以转无数次弯。
做题的时候心态要好啊。。
#include<iostream> #include<cstdio> #include<cstring> #include<algorithm> #include<queue> #include<set> #include<vector> #define maxn 1005 #define inf 0x3f3f3f3f using namespace std; typedef struct { int x,y; }P; P a[maxn]; int v[4][maxn]; int ans,n,flag; void solve() { P c; c.x=0,c.y=0; int flag1,f; flag1=1; while(1) { // cout<<"flag "<<flag1<<" "<<c.x<<" "<<c.y<<endl; int mi,ma,j; mi=inf,ma=-inf,f=1; if(flag1==1) { for(int i=1;i<=n;i++) { if(c.y==a[i].y&&c.x<a[i].x&&a[i].x<mi) { mi=a[i].x; f=0; j=i; } } if(f) return; else { if(v[0][j]) {flag=1;return ;} c.x=mi-1; ans++; flag1=2; v[0][j]=1; } } else if(flag1==2) { for(int i=1;i<=n;i++) { if(c.x==a[i].x&&c.y>a[i].y&&ma<a[i].y) { ma=a[i].y; f=0; j=i; } } if(f) return ; else { if(v[1][j]) {flag=1;return ;} c.y=ma+1; ans++; flag1=3; v[1][j]=1; } } else if(flag1==3) { for(int i=1;i<=n;i++) { if(c.y==a[i].y&&c.x>a[i].x&&a[i].x>ma) { ma=a[i].x; f=0; j=i; } } if(f) return; else { if(v[2][j]){flag=1;return;} c.x=ma+1; ans++; flag1=4; v[2][j]=1; } } else if(flag1==4) { for(int i=1;i<=n;i++) { if(c.x==a[i].x&&c.y<a[i].y&&mi>a[i].y) { mi=a[i].y; f=0; j=i; } } if(f) return ; else { if(v[3][j]) {flag=1;return;} c.y=mi-1; ans++; flag1=1; v[3][j]=1; } } } } int main() { while(scanf("%d",&n)!=EOF) { for(int i=1;i<=n;i++) scanf("%d%d",&a[i].x,&a[i].y); ans=0; flag=0; memset(v,0,sizeof(v)); solve(); if(flag) printf("-1\n"); else printf("%d\n",ans); } return 0; }