感觉有点难写。。模拟都这样
直接暴力每一个点的轨迹,看看最多能过几个点就行了
问题就在于每一个点经过之后会消失,所以我们需要处理一下
我的处理方法是对于每一个点,用set维护它所能到达的点以及两点间的距离,并且按距离排序,距离短的点先消失
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
#include"cstdio" #include"queue" #include"cmath" #include"stack" #include"iostream" #include"algorithm" #include"cstring" #include"queue" #include"map" #include"set" #include"vector" #define LL long long #define mems(a,b) memset(a,b,sizeof(a)) #define ls pos<<1 #define rs pos<<1|1 #define max(a,b) (a)>(b)?(a):(b) using namespace std; const int N = 3005; const int MAXN = 200; const int INF = 0x3f3f3f3f; struct node{ int x,y; char d[2]; }p[N]; set<pair<int,int> > G[N]; int vis[N],cnt; void check(int i,int j){ if(p[i].x!=p[j].x&&p[i].y!=p[j].y) return ; if(p[i].x==p[j].x){ if(p[i].y<p[j].y){ if(p[i].d[0]=='v') G[i].insert(make_pair(p[j].y-p[i].y,j)); if(p[j].d[0]=='^') G[j].insert(make_pair(p[j].y-p[i].y,i)); } else{ if(p[i].d[0]=='^') G[i].insert(make_pair(p[i].y-p[j].y,j)); if(p[j].d[0]=='v') G[j].insert(make_pair(p[i].y-p[j].y,i)); } } else{ if(p[i].x<p[j].x){ if(p[i].d[0]=='>') G[i].insert(make_pair(p[j].x-p[i].x,j)); if(p[j].d[0]=='<') G[j].insert(make_pair(p[j].x-p[i].x,i)); } else{ if(p[i].d[0]=='<') G[i].insert(make_pair(p[i].x-p[j].x,j)); if(p[j].d[0]=='>') G[j].insert(make_pair(p[i].x-p[j].x,i)); } } } void dfs(int u){ cnt++; vis[u]=1; if(G[u].empty()) return; set<pair<int,int> >::iterator it; for(it=G[u].begin();it!=G[u].end();it++) if(!vis[(*it).second]) break; if(it!=G[u].end()) dfs((*it).second); } int main(){ int n; while(~scanf("%d",&n)){ for(int i=0;i<n;i++) G[i].clear(); for(int i=0;i<n;i++) scanf("%d%d%s",&p[i].x,&p[i].y,p[i].d); for(int i=0;i<n;i++) for(int j=0;j<i;j++) check(i,j); int ans=1; for(int i=0;i<n;i++){ cnt=0; mems(vis,0); dfs(i); ans=max(ans,cnt); } printf("%d ",ans); } return 0; }