1568:光照强度

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;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值