您的位置:首页 > 其它

ACM PKU 2729 -- Robocode (…

2013-04-25 17:37 387 查看
原文地址:ACM PKU 2729 -- Robocode ( 2005 北京赛区 H 题 )作者:snuchttp://acm.pku.edu.cn/JudgeOnline/problem?id=2729

这题是模拟题,算道难题.我主要想练习一下自己考虑问题的全面性和严谨性,事实证明,功夫还不够.题目是模拟FC上的坦克大决战游戏(当然没那么复杂),通过执行一系列命令后判断场上最后的坦克.

其实用C完全可以做,但我想练习一下类(我用C++写的代码少之又少),就用C++写了.写了个300多行的程序后交上是错.我仔细检察后也没找出问题.在POJ上问了过这题的人,他告我"实际上只要把模拟的单位时间变成原来的1/6,把整个战场扩大6倍就保证不会有问题了",我照做,通过了.

其实我还是不能理解:虽然我没有扩大6倍.但我确实仔细考虑了1/3s,1/2s/2/3s的情况.现在我还是不知我哪里没有考虑到(看题太晕,放弃).看来我设计的模型不够好,写出的程序既复杂又容易出错.教训呐.用离散的点来代表连续的时间是这题的关键.
PS:北京赛区还有道更难的模拟题I题,如果能通过网上预赛的话,我一定拿来做做.
 
程序如下:(由于C++用的不多肯定有很多不足之处)

#include<iostream>

#include<cstring>

using namespace std;

struct Shot{

    int x;

    int y;

    bool be;

    int degree;

}shot[1000];

struct Command{

    int time;

    int name;

    int content;

    int angle;

}command[1000];

int qshot,n;

void shotmove();

class Tank

{

public:

    Tank(int lx,int ly,int ldegree);

    Tank();

    ~Tank();

    void settank(int lx,int ly,int ldegree);

    void bemoving();

    void stop();

    void turn(int d);

    void moving();

    void shooting();

    void killing();

    void bomb();

    bool getbe();

private:

    int x;

    int y;

    int degree;

    bool move;

    bool be;

};

Tank tank[10];

int main()

{

    int m,i,j,x,y,degree,qcommand,time,c,d;

    char name[10][11],strna[11],strco[6];

    scanf("%d%d",&n,&m);

    while (n!=0 || m!=0)

    {

          c=0;

          for (i=0;i<n;i++)

          {

                scanf("%s%d%d%d",name[i],&x,&y,°ree);

                x*=6;

                y*=6;

                tank[i].settank(x,y,degree);

          }

          for (i=0;i<m;i++)

          {

                scanf("%d%s%s",&command[i].time,strna,strco);

                command[i].time*=6;

                for (j=0;j<n;j++)
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: