COJ 1692:模拟

感觉有点难写。。模拟都这样

 

直接暴力每一个点的轨迹,看看最多能过几个点就行了

问题就在于每一个点经过之后会消失,所以我们需要处理一下

我的处理方法是对于每一个点,用set维护它所能到达的点以及两点间的距离,并且按距离排序,距离短的点先消失

#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\n",ans);
    }
    return 0;
}
View Code

 

posted @ 2016-03-14 19:27  Septher  阅读(170)  评论(0编辑  收藏  举报