Online JudgeProblem SetAuthorsOnline ContestsUser
Web Board
Home Page
F.A.Qs
Statistical Charts
Problems
Submit Problem
Online Status
Prob.ID:
Register
Update your info
Authors ranklist
Current Contest
Past Contests
Scheduled Contests
Award Contest
User ID:
Password:
  Register

送上代码和注释

Posted by LXY5201314 at 2018-08-04 21:08:49 on Problem 2729
#include<algorithm>
#include<cstdio>
#include<cstring>
using namespace std;
const int MAXN_X=73;    //13+(6-1)*12
const int MAXN=1005;
struct node
{
    char name[20];   //名字
    int x,y;    //坐标
    int Move;   //判断坦克是否移动
    int facing;   //方向
    int exist;     //生存
};
node tank[MAXN+5];   //坦克
node shoot[MAXN+5];   //子弹
int tankmap[MAXN_X+5][MAXN_X+5];    //坦克分布图
int shootmap[MAXN_X+5][MAXN_X+5];    //子弹分布图
struct node1
{
    int time;   //时间
    int Move;   //判断坦克是否移动
    char name[20];   //名字
    char content[20];    //内容
    int angle;   //角度
}cmd[MAXN+5];
int main()
{
    int n,m;   //n为坦克数量,m为命令数
    while(scanf("%d%d",&n,&m)!=EOF)
    {
        if(n==0&&m==0)break;
        memset(shootmap,-1,sizeof(shootmap));
        memset(tankmap,-1,sizeof(tankmap));
        for(int i=0;i<n;i++)
        {
            scanf("%s%d%d%d",tank[i].name,&tank[i].x,&tank[i].y,&tank[i].facing);
            tank[i].x=tank[i].x*6/10;       //离散化数组,坦克的速度为10像素
            tank[i].y=tank[i].y*6/10;
            tankmap[tank[i].x][tank[i].y]=i;    //加入坦克分布数组里面,标记该位置有坦克i
            tank[i].exist=1;     //i坦克存活
            tank[i].Move=0;    //都初始为0移动
        }
        for(int i=0;i<m;i++)
        {
            scanf("%d%s%s",&cmd[i].time,cmd[i].name,cmd[i].content);
            if(strcmp(cmd[i].content,"TURN")==0)
            {
                scanf("%d",&cmd[i].angle);       //移动的角度
            }
            cmd[i].time*=6;    //同样离散化扩大6倍
        }
        int totalshoot=0;   //总共子弹数
        int t=0;    //第t时间
        int cmd_count=0;   //读了第几条命令
        while(1)
        {
            for(int i=0;i<MAXN_X;i++)       //每次都更新子弹的数组为-1,然后在进行更新
            {
                for(int j=0;j<MAXN_X;j++)
                {
                    shootmap[i][j]=-1;
                }
            }
            for(int i=0;i<totalshoot;i++)
            {
                if(shoot[i].exist==1)   //更新子弹分布图
                {
                    shootmap[shoot[i].x][shoot[i].y]=1;
                }
            }
            for(int i=0;i<MAXN_X;i++)
            {
                for(int j=0;j<MAXN_X;j++)
                {
                    if(tankmap[i][j]!=-1&&shootmap[i][j]!=-1)
                    {
                        for(int k=0;k<totalshoot;k++)
                        {
                            if(shoot[k].exist==1&&shoot[k].x==i&&shoot[k].y==j)   //子弹存在,并且等于坦克的坐标就删除该子弹,同时结束循环后坦克也要死
                            {
                                shoot[k].exist=0;
                            }
                        }
                        tank[tankmap[i][j]].exist=0;    //该坦克被打死
                        tankmap[i][j]=shootmap[i][j]=-1;   //更新地图
                    }
                }
            }
            while(cmd_count<m&&cmd[cmd_count].time==t)   //在t时间的时候,并且执行命令
            {
                for(int j=0;j<n;j++)
                {
                    if(tank[j].exist==1&&strcmp(tank[j].name,cmd[cmd_count].name)==0)   //i坦克存在,并且名字和命令中的名字相同
                    {
                        if(strcmp(cmd[cmd_count].content,"MOVE")==0)    //坦克移动
                        {
                            tank[j].Move=1;   //移动为1
                        }
                        else if(strcmp(cmd[cmd_count].content,"STOP")==0)   //坦克停止
                        {
                            tank[j].Move=0;   //停止为0
                        }
                        else if(strcmp(cmd[cmd_count].content,"TURN")==0)   //调整角度
                        {
                            tank[j].facing=(tank[j].facing+cmd[cmd_count].angle+360)%360;  //根据题目所给出的来计算角度
                        }
                        else if(strcmp(cmd[cmd_count].content,"SHOOT")==0)   //射出子弹
                        {
                            shoot[totalshoot].x=tank[j].x;   //子弹初始位置为坦克位置
                            shoot[totalshoot].y=tank[j].y;
                            shoot[totalshoot].facing=tank[j].facing;   //子弹射出的角度为坦克对准的角度
                            shoot[totalshoot].exist=1;     //子弹存在
                            totalshoot++;     //累加----计算有多少子弹
                        }
                        break;
                    }
                }
                cmd_count++;   //读下一条命令
            }
            for(int i=0;i<totalshoot;i++)   //更新子弹的状态
            {
                if(shoot[i].exist==1)     //更新子弹的前提就是子弹存在
                {
                    if(shoot[i].facing==0)    //子弹的角度为0,往右
                    {
                        if(shoot[i].x+2<MAXN_X)
                        {
                            shoot[i].x+=2;   //加二是因为,子弹的速度为20像素,也就是2个格子
                        }
                        else                 //不满足就是超出范围了,子弹就要消失
                        {
                            shoot[i].exist=0;
                        }
                    }
                    else if(shoot[i].facing==90)//往上
                    {
                        if(shoot[i].y+2<MAXN_X)
                        {
                            shoot[i].y+=2;
                        }
                        else
                        {
                            shoot[i].exist=0;
                        }
                    }
                    else if(shoot[i].facing==180)   //往左
                    {
                        if(shoot[i].x-2<MAXN_X&&shoot[i].x-2>=0)
                        {
                            shoot[i].x-=2;
                        }
                        else
                        {
                            shoot[i].exist=0;
                        }
                    }
                    else if(shoot[i].facing==270)    //往下
                    {
                        if(shoot[i].y-2<MAXN_X&&shoot[i].y-2>=0)
                        {
                            shoot[i].y-=2;
                        }
                        else
                        {
                            shoot[i].exist=0;
                        }
                    }
                }
            }
            for(int i=0;i<n;i++)   //更新坦克移动的状态
            {
                if(tank[i].exist==1&&tank[i].Move==1)    //更新坦克的时候,前提就是坦克要存在,并且该坦克标记了要移动
                {
                    tankmap[tank[i].x][tank[i].y]=-1;   //既然移动就要把当前位置给删除
                    if(tank[i].facing==0&&tank[i].x+1<MAXN_X)    //看角度为多少,为0就是往右移动
                    {
                        tank[i].x++;                                //移动加1
                    }
                    else if(tank[i].facing==90&&tank[i].y+1<MAXN_X)   //往上
                    {
                        tank[i].y++;
                    }
                    else if(tank[i].facing==180&&tank[i].x-1>=0)     //往左
                    {
                        tank[i].x--;    //减一
                    }
                    else if(tank[i].facing==270&&tank[i].y-1>=0)  //往下
                    {
                        tank[i].y--;    //减一
                    }
                    tankmap[tank[i].x][tank[i].y]=i;    //然后在更新i坦克的新位置
                }
            }
            if(cmd_count==m)     //如果命令执行完了,就看子弹都飞完了吗,如果子弹没有飞完就继续执行,否则结束循环
            {
                int e=1;
                for(int i=0;i<totalshoot;i++)
                {
                    if(shoot[i].exist==1)
                    {
                        e=0;
                        break;
                    }
                }
                if(e)
                {
                    break;
                }
            }
            t++;    //下一时刻的命令
        }
        char Win_Tank[20];
        int jude=0;
        for(int i=0;i<n;i++)
        {
            if(tank[i].exist==1)    //找存在的坦克,如果有两个以上的坦克就没有胜利者
            {
                jude++;
                strcpy(Win_Tank,tank[i].name);
            }
        }
        if(jude==1)
        {
            printf("%s\n",Win_Tank);   //否则输出胜利者
        }
        else
        {
            printf("NO WINNER!\n");
        }
    }
    return 0;
}

Followed by:

Post your reply here:
User ID:
Password:
Title:

Content:

Home Page   Go Back  To top


All Rights Reserved 2003-2013 Ying Fuchen,Xu Pengcheng,Xie Di
Any problem, Please Contact Administrator