标题被袭击的村庄(求指正!)
邪恶势力要进攻 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;
}