欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

NOIP 2018模拟赛() 2018 11 3 Day1 T1

程序员文章站 2022-03-14 19:51:20
...

T1 铃仙的红色之瞳(eyes)

题目描述

为了方便你的预测,铃仙对该符卡进行了改造。
敌方非常强大,可以看作有无限的体力。通过该符卡,铃仙可以释放出子弹,敌方触碰到子弹就会损失一格体力。注意,每次敌方损失体力之后,其位置不会改变。
当敌方和铃仙 x 坐标相同上时,每秒铃仙损失一点体力(敌方的攻击比较特殊,可以对前后都进行攻击)。注意,这里的秒指的是时间间隔,即第 A 秒时候敌方开始与铃仙处于一条直线上,第 B 秒时候敌方离开这条直线,那么铃仙受到的伤害是(B-A)点。特殊地,如果刚开始铃仙就和敌方在一条直线上,则第 0 秒~第 1 秒也受到一点伤害。若最后铃仙和敌方在 x 坐标相同的位置或者敌方处于有子弹的位置上时,它们只会在第 Q-1 秒到第 Q 秒时受到伤害,并不会在第 Q 秒到第 Q+1 秒受到伤害。
地图是一个 n*m 的矩形,分别对应的 x 坐标为[1,n],y 坐标为[1,m],给定敌方的初始位置和铃仙的位置(铃仙不会移动),当铃仙发出的子弹超过边界时子弹消失,当敌方越过边界时敌方自动回到初始位置。
现在有 Q 秒,每秒一次操作,可能是铃仙的操作也可能是敌方的操作,可能存在的操作如下:
Ins x y 铃仙在(x,y)处召唤了一颗子弹(如果原先就有子弹则该操作无效)
Del x y 铃仙收回法力,让(x,y)处的子弹消失(如果原先没有子弹则该操作无效)
MA U 铃仙将所有子弹上移一格
MA D 铃仙将所有子弹下移一格
MA L 铃仙将所有子弹左移一格
MA R 铃仙将所有子弹右移一格
MB U 敌方上移一格
MB D 敌方下移一格
MB L 敌方左移一格
MB R 敌方右移一格
现在要你计算 Q 秒后敌方损失的体力和铃仙损失的体力。
(注:左移指的是横坐标-1,下移指的是纵坐标-1)
n,m<=100,Q<=1000

 

题解:模拟!!!

时间复杂度:O(能过)

我居然考场上只有40分,后来发现,我在转移的时候竟然在逐层向下修改,最后把子弹都踢出了地图,555.。

chs表示 跪在评测机前...
 

代码如下:

#include <cstdio>
#include <iostream>
#include <cstring>
#include <cmath>
#include <cstdlib>
#include <algorithm>
#include <queue>
#define ll long long
#define N 105
using namespace std;
int sho[N][N];
ll ansa,ansb;
char str[10];
int zyy[N][N]; //这个数组一定要开,不然就把子弹转移没了!!! 
int main() 
{
	freopen("eyes.in","r",stdin);
	freopen("eyes.out","w",stdout);
	int Case;
	scanf("%d",&Case);
	int n,m;
	scanf("%d%d",&n,&m);
	int ax,ay,bx,by,bxx,byy;
	scanf("%d%d%d%d",&ax,&ay,&bx,&by);
	bxx=bx,byy=by;
	int Q;
	scanf("%d",&Q);
	while(Q--)
	{
		memset(zyy,0,sizeof(zyy));
		scanf("%s",str+1);
		if(ax==bx) ansa++;
		if(sho[bx][by]) ansb++;
		if(str[1]=='I')
		{
			int x,y;
			scanf("%d%d",&x,&y);
			if(x<1||y<1||x>n||y>m) {}
			else sho[x][y]=1;
		}else if(str[1]=='D')
		{
			int x,y;
			scanf("%d%d",&x,&y);
			if(x<1||y<1||x>n||y>m) {}
			else sho[x][y]=0;
		}else if(str[1]=='M')
		{
			if(str[2]=='A')
			{
				scanf("%s",str+1);
				if(str[1]=='U')
				{
					for(int i = 1;i <= n;i++)
					{
						for(int j = 1;j <= m;j++)
						{
							if(sho[i][j])
							{
								//sho[i][j]=0;
								if(j+1<=m) zyy[i][j+1]=1;
							}
						}
					}
				}else if(str[1]=='D')
				{
					for(int i = 1;i <= n;i++)
					{
						for(int j = 1;j <= m;j++)
						{
							if(sho[i][j])
							{
								//sho[i][j]=0;
								if(j-1>0) zyy[i][j-1]=1;
							}
						}
					}
				}else if(str[1]=='L')
				{
					for(int i = 1;i <= n;i++)
					{
						for(int j = 1;j <= m;j++)
						{
							if(sho[i][j])
							{
								//sho[i][j]=0;
								if(i-1>0) zyy[i-1][j]=1;
							}
						}
					}
				}else if(str[1]=='R')
				{
					for(int i = 1;i <= n;i++)
					{
						for(int j = 1;j <= m;j++)
						{
							if(sho[i][j])
							{
							///	sho[i][j]=0;
								if(i+1<=n) zyy[i+1][j]=1;
							}
						}
					}
				}
				//memset(zyy,0,sizeof(zyy));
				for(int i = 1;i <= n;i++)
				{
					for(int j = 1;j <= m;j++)
					{
						sho[i][j]=zyy[i][j];
					}
				}
			}else if(str[2]=='B')
			{
				scanf("%s",str+1);	
				if(str[1]=='U')
				{
					by++;
				}else if(str[1]=='D')
				{
					by--;
				}else if(str[1]=='L')
				{
					bx--;
				}else if(str[1]=='R')
				{
					bx++;
				}
				if(bx<1||by<1||bx>n||by>m) bx=bxx,by=byy;
			}
		}
	}
	printf("%I64d\n%I64d\n",ansb,ansa);
	return 0 ;
}
/*
1
5 5
2 2
2 5
3
Ins 2 5
MA D
Del 2 4
*/

 

相关标签: 模拟