被袭击的村庄

标题被袭击的村庄(求指正!)

邪恶势力要进攻 AA 村了!

AA 村是一个 n*mn∗m 的矩形,每个点上是道路、房屋、田地三者其一,耐久度分别是 a,b,ca,b,c。

邪恶势力要进行 qq 次攻击,每次攻击都是使用炮弹对村庄进行轰炸。

邪恶势力有两种炮弹,分别是普通炮弹(编号为 11 )和高级炮弹(编号为 00 )。两种炮弹的攻击范围都是 k\times kk×k 的方形,其中方形中心是炮弹落地点。炮弹对攻击范围内每个格子造成的损害不一定一样,用一个 k\times kk×k 的矩阵描述,每个数字表示对对应格子造成的伤害。高级炮弹和普通炮弹的伤害矩阵相同。

上述矩阵描述的是直接攻击的伤害。对于高级炮弹,它的攻击会造成溅射伤害:如果这个格子被直接攻击,那么周围八个格子都会受到溅射伤害,造成的伤害是 ww 。所以一个高级炮弹可能对同一个格子进行多次伤害。溅射伤害不会继续造成溅射伤害。普通炮弹不造成溅射伤害。

不论是直接攻击的伤害还是溅射造成的伤害,都会使耐久度下降,下降量等于伤害的大小。耐久度最多降为 00,一个建筑单位受到的伤害定义为耐久度的减少量。

如果攻击范围涉及到地图边界外,那么不予计算(溅射伤害也不会计算)。

现在,给定上述的所有信息,我们想知道 AA 村被袭击之后的道路、房屋、田地的总伤害,以及全村的总伤害。

输入格式
第一行两个整数 n,mn,m,表示 A 村大小。

接下来一行三个整数 a,b,ca,b,c。

接下来一行两个整数 k,wk,w。

接下来 kk 行,每行 kk 个数,描述高级炮弹和普通炮弹对相对位置所造成的伤害。

接下来一个 n\times mn×m 的矩阵,表示 AA 村的布局。 11 表示道路, 22 表示房屋, 33 表示田地。

接下来一个数 qq,表示邪恶势力要进行 qq 轮攻击。

接下来 qq 行,每行三个数 id,x,yid,x,y,分别是炮弹的编号以及他所攻击的矩阵的中心位置的 xx 坐标、 yy 坐标,即第 xx 行 yy 列。

输出格式
第一行三个整数,分别是对道路、房屋、田地造成的总伤害

第二行一个整数,表示对全村造成的伤害。

数据范围
kk 一定是奇数。

对于 30%30% 的数据:1 \leq n,m,k,q \leq 501≤n,m,k,q≤50

对于 100%100% 的数据:1 \leq n,m,k,q \leq 300, 1 \leq a,b,c,w \leq 10000000001≤n,m,k,q≤300,1≤a,b,c,w≤1000000000

样例输入 复制
3 3
1 1 1
3 1
1 1 1
1 1 1
1 1 1
1 1 1
1 1 1
1 1 1
1
1 2 2
样例输出 复制
9 0 0
9
以下样例只通过一组。。。(流水账)

#include <stdio.h>
int main()
{
long long int hp[51][51],vis[51][51],a,b,c,a1,b1,c1;
int n,m,k,w,q,t,hurt[301][301];
scanf("%d%d",&n,&m);
 scanf("%lld%lld%lld",&a,&b,&c);
 scanf("%d%d",&k,&w);
 	for(int k1=1;k1<=k;k1++)
 	for(int k2=1;k2<=k;k2++)
 	{
	 scanf("%d",&hurt[k1][k2]);
 }
 for(int i=1;i<=n;i++)
 for(int j=1;j<=m;j++)
 {
 	scanf("%d",&t);
 	if(t==1)
 	{
 		vis[i][j]=1;
	 hp[i][j]=a;
	 }
	 if(t==2)
 	{
 		vis[i][j]=2;
	 hp[i][j]=b;
	}
 	if(t==3)
 	{
 		vis[i][j]=3;
	 hp[i][j]=c;
 }
 }
 scanf("%d",&q);
 while(q--)
 {
 	int x,y,id;
 	scanf("%d%d%d",&id,&x,&y);
 	for(int i=x-k/2,ii=1;i<=x+k/2,ii<=k;ii++,i++)
 	for(int j=y-k/2,jj=1;j<=y+k/2,jj<=3;j++,jj++)
 	{
 		if(id==1)
 		{
 			if(j<1||j>m||i<1||i>n)
 			continue;
 			if(hp[i][j]-hurt[ii][jj]>0)
 			{
			 hp[i][j]-=hurt[ii][jj];
 			if(vis[i][j]==1) a1+=hurt[ii][jj];
			 if(vis[i][j]==2) b1+=hurt[ii][jj];
			 if(vis[i][j]==3) c1+=hurt[ii][jj];
			 }
			 else
 			{if(vis[i][j]==1) a1+=hp[i][j];
 			if(vis[i][j]==2) b1+=hp[i][j];
 			if(vis[i][j]==3) c1+=hp[i][j];
			 hp[i][j]=0;
		 }
		 }
		 else
		 {
		 	if(j<1||j>m||i<1||i>n)
 			continue;
 			if(hp[i][j]-hurt[ii][jj]>0)
 			{
			 hp[i][j]-=hurt[ii][jj];
			 if(vis[i][j]==1) a1+=hurt[ii][jj];
			 if(vis[i][j]==2) b1+=hurt[ii][jj];
			 if(vis[i][j]==3) c1+=hurt[ii][jj];
			 }
			 else
 			{if(vis[i][j]==1) a1+=hp[i][j];
 			if(vis[i][j]==2) b1+=hp[i][j];
 			if(vis[i][j]==3) c1+=hp[i][j];
			 hp[i][j]=0;
 			}
			 for(int r=i-1;r<=i+1;r++)
 			for(int t=j-1;t<=j+1;t++)
 			{
 					 	if(t<1||t>m||r<1||r>n)
 			continue;
 			if(hp[r][t]-w>0)
 			{
			 hp[r][t]-=w;
 	          if(vis[r][t]==1) a1+=w;
			 if(vis[r][t]==2) b1+=w;
			 if(vis[r][t]==3) c1+=w;
			 }else
 			{ if(vis[r][t]==1) a1+=hp[r][t];
			 if(vis[r][t]==2) b1+=hp[r][t];
			 if(vis[r][t]==3) c1+=hp[r][t];
			 hp[r][t]=0;
			 }
			 }
		 }
	 }
 }
    long long int ans=a1+b1+c1;
 printf("%lld %lld %lld\n",a1,b1,c1);
    printf("%lld",ans);
return 0;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值