IT博客汇
  • 首页
  • 精华
  • 技术
  • 设计
  • 资讯
  • 扯淡
  • 权利声明
  • 登录 注册

    POJ-2632 解题报告

    林 达意发表于 2012-06-13 11:09:47
    love 0

    题意简述

    给定A*B的格子,放入N个机器人,每个机器人初始位置及朝向给定。给定M条指令。指令类型有三种:

    1、L:左转90°      2、R:右转90°       3、F:前进一格

    问执行指令过程中机器人是否发生碰撞,碰撞包括碰墙或碰其他机器人。安全执行完所有指令输出OK。(程序只需输出发生的第一次碰撞)

    算法分析

    模拟法。一条一条指令执行。指令执行过程把一条指令重复几遍拆分成几条指令来执行。每执行一条判断是否发生碰撞。若发生碰撞则标记位记0并输出。注意还需继续读取剩余输入。

    Problem Status: AC。时间0ms,内存156k

    ——————————————————————分割线——————————————————————

    TIPS:

    机器人方向用0~3 四个数字表示四个朝向。转向时自增或自减即可。注意处理转后方向变为负值的情况。

    ——————————————————————分割线——————————————————————

    优化:

    POJ最高成绩:内存4k 时间0ms……我现在开始怀疑内存占用和编译器有关系了……太诡异了……

    程序样例

    #include
    
    int main()
    {
        int k,a,b,n,m,i,j,num,rep,rect[100][100],robot[100][3];
        int flag;
        char c;
        for(scanf("%d",&k);k>0;k--)
        {
            scanf("%d%d%d%d",&a,&b,&n,&m);
            for(i=0;i0;rep--)
                {
                    if (flag){
                    if (c=='L') robot[num][2]=(robot[num][2]+1)%4;
                    if (c=='R') robot[num][2]=(robot[num][2]-1);
                    if (robot[num][2]<0) robot[num][2]+=4;
                    if (robot[num][2]<0) robot[num][2]=-robot[num][2];
                    if (c=='F')
                        switch(robot[num][2])
                        {
                            case 0:
                                 rect[robot[num][0]][robot[num][1]]=0;
                                 robot[num][0]++;
                                 rect[robot[num][0]][robot[num][1]]+=(num+1);
                                 break;
                            case 1:
                                 rect[robot[num][0]][robot[num][1]]=0;
                                 robot[num][1]--;
                                 rect[robot[num][0]][robot[num][1]]+=(num+1);
                                 break;
                            case 2:
                                 rect[robot[num][0]][robot[num][1]]=0;
                                 robot[num][0]--;
                                 rect[robot[num][0]][robot[num][1]]+=(num+1);
                                 break;
                            case 3:
                                 rect[robot[num][0]][robot[num][1]]=0;
                                 robot[num][1]++;
                                 rect[robot[num][0]][robot[num][1]]+=(num+1);
                                 break;
                        }
                    if (robot[num][0]<0||robot[num][0]>=b||robot[num][1]<0||robot[num][1]>=a)
                    {
                        printf("Robot %d crashes into the walln",num+1);
                        flag=0;
                    }
                    if (rect[robot[num][0]][robot[num][1]]>(num+1))
                    {
                        printf("Robot %d crashes into robot %dn",num+1,rect[robot[num][0]][robot[num][1]]-num-1);
                        flag=0;
                    }}
                }
            }
            if (flag) printf("OKn");
        }
        system("pause");
        return 0;
    }
    


沪ICP备19023445号-2号
友情链接