POJ3362 模拟|水题

poj.org/problem?id=3362

又是一道AC比例超低的水题,说题意有分歧有点勉强,不清楚当年发生了什么。。。

题目倒是挺有趣的, 24hour是我以前热追的美剧

思路很简单,直接模拟

1. 记录每个位置上点的个数,如果某一时刻,点0坐在位置上所有点的个数等于点的总数,则检测到恐怖袭击

2. 每个点按照X..FLFLFL...交替的顺序寻找下一个位置, X是起始的方向

3. 除了第一次移动,F/L对应的实际方向由当前位置和前一次位置决定,这时候如果没有前一次位置那么点就保持不动

模拟的最长次数是24*3,非常小,所以每个点都可以维护一个栈来记录路径,当无路可走时就出站,有路走时则入栈,每移动一次更新相应位置的点的个数

实现

        for (i=1; i<=4; i++) for (j=1; j<=4; j++) cs[i][j]=0;
        scanf("%d", &n); if (n==0||n>MAXN) assert(0);
        for (k=0; k<n; k++) {
            p=ib; while(1) {
                if (scanf("%s", p)!=1) assert(0);
                i=0; while(p[i]&&p[i]!='F'&&p[i]!='L') i++;
                o=p[i]; if (o) break; p+=i;
            }
            p=ib; i=0; while(p[i]&&(p[i]<'0'||p[i]>'9')) i++; if(p[i]==0) assert(0);
            x=0; while(p[i]>='0'&&p[i]<='9') x=x*10+p[i++]-'0';
            while(p[i]&&(p[i]<'0'||p[i]>'9')) i++; if(p[i]==0) assert(0);
            y=0; while(p[i]>='0'&&p[i]<='9') y=y*10+p[i++]-'0';
            // if (ti==23) printf("%s\n", ib);
            if (x<1||x>4||y<1||y>4) assert(0);
            cs[x][y]++;
            pc[k]=1; pm[k]=o; pp[k][0].x=x; pp[k][0].y=y;
            frz[k]=0;
        }
        if (cs[x][y]==n) { printf("Case %d: %d, %d, 800\n", ti, x, y); continue; }
        dt=20; for (i=0; i<n; i++) {
            x=pp[i][0].x; y=pp[i][0].y;
            cs[x][y]--;
            if (pm[i]=='F') {
                y--; if (y<1) { y++; frz[i]=1; } else {
                    pc[i]++; pp[i][1].x=x; pp[i][1].y=y; pm[i]='L';
                }
            } else {
                x--; if (x<1) { x++; frz[i]=1; } else {
                    pc[i]++; pp[i][1].x=x; pp[i][1].y=y; pm[i]='F';
                }
            }
            cs[x][y]++;
        }
        while(dt<24*60) {
            m=pc[0]; x=pp[0][m-1].x; y=pp[0][m-1].y;
            if (cs[x][y]==n) break;
            // printf("%d:\n", dt);
            for (i=0; i<n; i++) {
                m=pc[i];
                if (frz[i]||m==1) continue;
                x=pp[i][m-1].x; y=pp[i][m-1].y;
                // printf("%d start with %d,%d\n", i, x, y);
                cs[x][y]--;
                if (pm[i]=='F') {
                    pm[i]='L';
                    dx=x-pp[i][m-2].x; dy=y-pp[i][m-2].y;
                    nx=dx+x; ny=dy+y;
                    if (nx<1||nx>4||ny<1||ny>4) {
                        if (dx==1) { dx=0; dy=-1; }
                        else if (dx==-1) { dx=0; dy=1; }
                        else if (dy==1) { dy=0; dx=1; }
                        else if (dy==-1) { dy=0; dx=-1; }
                        else assert(0);
                        nx=dx+x; ny=dy+y;
                    }
                } else {
                    pm[i]='F';
                    dx=x-pp[i][m-2].x; dy=y-pp[i][m-2].y;
                    if (dx==1) { dx=0; dy=-1; }
                    else if (dx==-1) { dx=0; dy=1; }
                    else if (dy==1) { dy=0; dx=1; }
                    else if (dy==-1) { dy=0; dx=-1; }
                    else assert(0);
                    nx=dx+x; ny=dy+y;
                }
                if (nx<1||nx>4||ny<1||ny>4) {
                    pc[i]--; x=pp[i][m-2].x; y=pp[i][m-2].y;
                } else {
                    x=nx; y=ny;
                    pp[i][m].x=x; pp[i][m].y=y; pc[i]++;
                }
                // printf("%d ===> %d,%d\n", i, x, y);
                cs[x][y]++;
            }
            dt+=20;
        }
        dt+=8*60;
        if (dt>=24*60) printf("Case %d: no terror threat\n", ti);
        else {
            m=pc[0]; x=pp[0][m-1].x; y=pp[0][m-1].y;
            printf("Case %d: %d, %d, %d%02d\n", ti, x, y, (dt/60)%24, dt%60);
        }

其实,开始看到ac比例这么低我是比较谨慎的,随机生成了几组数据在udebug上查看输出进行对比,但是总有些数据对不上,后来抱着试一试的心态提交,没想到居然1A.。。。可能是数据弱+我的理解没有太偏。。。。。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值