• POJ 2632 Crashing Robots (模拟 坐标调整)(fflush导致RE)


    题目链接:http://poj.org/problem?id=2632

    先话说昨天顺利1Y之后,直到今天下午才再出题 TAT,真是刷题计划深似海,从此AC是路人- -

    本来2632是道略微恶心点的模拟,但毕竟是模拟,一般模拟都是仅仅要演示样例过了基本就AC了。但这个题非常特殊

    我開始的时候一直跑不出測试演示样例。才发现题目中的插图和我构想的坐标系是不一样的(看来还不能轻易忽视掉插图啊)

    这个题给出的坐标系是纵轴为y,横轴为x,y从下到上依次递增,x轴是从左到右递增

    而我用的二维数组记录的地图,也就是说我的纵向是x轴并且从上到下递增。横向是y轴。从左到右递增

    在我调了程序近一个小时之后才发现了这个问题。

    然后突然懵了。不知道怎么实现了。

    突然的全盘否定让我瞬间没了思路

    过了一段时间我才缓过来,然后打算偷梁换柱

    由于这个题目仅仅有在定义机器人的时候才用到了坐标,在指令上没实用到坐标

    然后我就这样想,在过程处理上依旧使用数组那套坐标系。而在录入保存的时候做些转换

    scanf ("%d%d%s",&x,&y,to);
    
    MAP[B - y][x - 1] = i;
    rob[i].x = B - y;
    rob[i].y = x - 1;


     

    然后直接不用再管这套坐标系了

    后面进展顺利,非常快代码成形。调了几组数据全过。然后一交:RE

    然后赶紧看数据范围。地图范围,发现我开的远远大于范围最大值,由于是模拟。又没实用指针,所以检查了几遍代码,着重检查数组下标

    没有发现问题,跑了discuss里给的測试数据。全过,一交还是RE,卡了好久

    最终没有办法了,仅仅能乱改,直到AC.  (= = 乱改竟然改AC了)

    我改的是把录入字符改为录入字符串,仅仅取字符串第一个字符(s[0])。目的是不用控制空格(只是还是RE)

    然后由于已经不用空格了,我把我原来控制空格回车符的fflush(stdin)----清空输入流函数去掉

    然后提交AC,至于为什么fflush导致RE。实在不明确。百度直说了fflush并不是库函数,仅仅是库函数的补充,部分linux会导致不兼容

    尽管不是CE,但不排除是这方面的原因。只是fflush我在处理输入流的时候经经常使用,这是第一次出现故障。

    fflush导致了RE,也算给自己一次警告吧。

     

    总的来说,这个题也就是一个模拟。尽管麻烦点。但毕竟是个模拟题。

    代码例如以下:

     

    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
    #include <math.h>
    
    struct n
    {
        int x,y;
        int to;
    }rob[10000];
    
    int MAP[150][150];
    int A,B;
    
    int mov (int no,int turn)
    {
        int x = rob[no].x,y = rob[no].y;
        int to = rob[no].to;
    
        //printf ("!1!%d %d
    ",x,y);
    
        MAP[x][y] = -1;
        switch (to)
        {
        case 1:
            if (turn == 1)
            {
                rob[no].to = 4;
                //y--;
            }else if (turn == 2)
            {
                rob[no].to = 2;
                //y++;
            }else if (turn == 3)
            {
                x--;
            }
            break;
        case 2:
            if (turn == 1)
            {
                rob[no].to = 1;
                //x--;
            }else if (turn == 2)
            {
                rob[no].to = 3;
                //x++;
            }else if (turn == 3)
            {
                y++;
            }
            break;
        case 3:
            if (turn == 1)
            {
                rob[no].to = 2;
                //y++;
            }else if (turn == 2)
            {
                rob[no].to = 4;
                //y--;
            }else if (turn == 3)
            {
                x++;
            }
            break;
        case 4:
            if (turn == 1)
            {
                rob[no].to = 3;
                //x++;
            }else if (turn == 2)
            {
                rob[no].to = 1;
                //x--;
            }else if (turn == 3)
            {
                y--;
            }
            break;
        }
    
        //printf ("!2!%d %d
    ",x,y);
        if (x < 0 || y < 0 || x >= B || y >= A)
        {
            printf ("Robot %d crashes into the wall
    ",no + 1);
            return 0;
        }
    
        if (MAP[x][y] != -1)
        {
            printf ("Robot %d crashes into robot %d
    ",no + 1,MAP[x][y] + 1);
            return 0;
        }
    
        rob[no].x = x;
        rob[no].y = y;
        MAP[x][y] = no;
        return 1;
    }
    
    int main()
    {
        //freopen ("1.txt","w",stdout);
        int N;
        int i,k;
        scanf ("%d",&N);
    
        while (N--)
        {
            int n,m;
            memset (MAP,-1,sizeof (MAP));
            memset (rob,0,sizeof (rob));
            scanf ("%d%d",&A,&B);
            scanf ("%d%d",&n,&m);
    
            for (i = 0;i < n;i++)
            {
                int x,y;
                char to[10];
    
                //fflush (stdin);
                scanf ("%d%d%s",&x,&y,to);
    
                MAP[B - y][x - 1] = i;
                rob[i].x = B - y;
                rob[i].y = x - 1;
    
                if (to[0] == 'N')
                {
                    rob[i].to = 1;
                }else if (to[0] == 'E')
                {
                    rob[i].to = 2;
                }else if (to[0] == 'S')
                {
                    rob[i].to = 3;
                }else if (to[0] == 'W')
                {
                    rob[i].to = 4;
                }
            }
    
            int tf = 1;
    
            for (i = 0;i < m;i++)
            {
                int no,lop,iact;
                char act[10];
    
                //fflush (stdin);
                scanf ("%d%s%d",&no,act,&lop);
    
                if (act[0] == 'L')
                    iact = 1;
                else if (act[0] == 'R')
                    iact = 2;
                else if (act[0] == 'F')
                    iact = 3;
    
                    for (k = 0;k < lop;k++)
                        if (tf)
                            tf = mov (no - 1,iact);
            }
    
            if (tf)
                puts ("OK");
        }
    
        return 0;
    }
    


     

  • 相关阅读:
    【代码片段】双语导航/导航中鼠标经过变换文字
    【代码片段】渐变写法
    as3.0 复习一
    【代码片段】as3.0 鼠标指针更换代码
    二班信息管理系统
    ubuntu server下apache安装配置以及优化(摘录)
    bootstrap,好东西,对于后端开发人员是个解脱
    今天发现staff邮箱在用LDAP
    FastCGI及PHPFPM
    推荐vi配置及说明
  • 原文地址:https://www.cnblogs.com/ldxsuanfa/p/10513301.html
  • Copyright © 2020-2023  润新知