1568:光照强度
时间限制: 1 S | 内存限制: 8192 KB
Accept: 57 | Submit: 211
[提交] [状态] [我的提交] [讨论版]
描述
有一个长方形的房间,可以近似地看成由a行b列的方格构成。在房间里有m盏灯,每盏灯有一定的光照强度c,可以照亮周围一块区域,作用如下:
1、对于灯所在的方格,亮度增加c;
2、离灯1格距离的方格,亮度增加c/2,如果该值不是整数,那么取其整数部分(注意每盏灯单独计算对周围亮度的影响时就要取整);
3、离灯2格距离的方格,亮度增加c/4的整数部分;
4、以此类推,离灯d格距离的方格,亮度增加c/(2d)的整数部分,其中表示数学里的幂运算。
关于距离的计算方法:若两个方格的坐标分别为(x1,y1)和(x2,y2),那么这两格的距离是|x1-x2|+|y1-y2|
例如下图是一个8行8列的房间,在第4行第5列有一盏光照强度为11的灯,灯对区域的照亮效果如图中的数字所示。
当区域里不止一盏灯的时候,照亮效果可以叠加,例如下图是两盏灯共同作用的效果。
输入
多组案例。一个正整数n,表示案例的数量。(n<=20)
每组案例中,先是三个正整数a、b、m,表示房间有a行b列,有m盏灯。(a<=50,b<=50,m<=50)
然后是m行数据,每行数据有3个正整数x、y、c,表示某一盏灯位于第x行第y列,光照强度为c。(左上角称为第1行第1列,1<=x<=a,1<=y<=b,c<=1000000)
输出
针对每组案例,依次输出每一格的亮度,每两个数字之间留一个空格,每行结束后要换行。
每组案例最后一行输出完正常换行,不必在案例之间多换一行。
样例输入
2
3 2 1
1 1 4
8 8 2
4 5 11
7 4 4
样例输出
4 2
2 1
1 0
0 0 0 0 1 0 0 0
0 0 0 1 2 1 0 0
0 0 1 2 5 2 1 0
0 1 2 5 11 5 2 1
0 0 1 3 5 2 1 0
0 0 1 3 3 1 0 0
0 1 2 4 3 1 0 0
0 0 1 2 1 0 0 0
HINT
第2组样例即是【描述】中的第二幅图
来源
第八届信息学院编程大赛
#include <iostream>
#include<string>
#include<algorithm>
#include<cmath>
using namespace std;
int main()
{
int n, a, b, m, x, y, c;
cin >> n;
while (n--)
{
cin >> a >> b >> m;
int** zu = new int* [a];
for (int i = 0; i < a; i++)
{
zu[i] = new int[b];
}
for (int i = 0; i < a; i++)
{
for (int j = 0; j < b; j++)
{
zu[i][j] = 0;
}
}
while (m--)
{
cin >> x >> y >> c;
for (int i = 0; i < a; i++)
{
for (int j = 0; j < b; j++)
{
int d= abs(x - i-1) + abs(y - j-1);
int d2 = pow(2, d);
zu[i][j] += (c / d2);
}
}
}
for (int i = 0; i < a; i++)
{
for (int j = 0; j < b; j++)
{
if (j == (b - 1))
{
cout << zu[i][j] << endl;
}
else
{
cout << zu[i][j] << " ";
}
}
}
for (int i = 0; i < a; i++)
{
delete[]zu[i];
}
delete[]zu;
}
return 0;
}