hdu 5538 House Building 【矩阵表面积】

House Building

Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 262144/262144 K (Java/Others)
Total Submission(s): 1808    Accepted Submission(s): 1138

Problem Description

Have you ever played the video game Minecraft? This game has been one of the world‘s most popular game in recent years. The world of Minecraft is made up of lots of 1×1×1 blocks in a 3D map. Blocks are the basic units of structure in Minecraft, there are many types of blocks. A block can either be a clay, dirt, water, wood, air, ... or even a building material such as brick or concrete in this game.


Figure 1: A typical world in Minecraft.

Nyanko-san is one of the diehard fans of the game, what he loves most is to build monumental houses in the world of the game. One day, he found a flat ground in some place. Yes, a super flat ground without any roughness, it‘s really a lovely place to build houses on it. Nyanko-san decided to build on a n×m big flat ground, so he drew a blueprint of his house, and found some building materials to build.

While everything seems goes smoothly, something wrong happened. Nyanko-san found out he had forgotten to prepare glass elements, which is a important element to decorate his house. Now Nyanko-san gives you his blueprint of house and asking for your help. Your job is quite easy, collecting a sufficient number of the glass unit for building his house. But first, you have to calculate how many units of glass should be collected.

There are n rows and m columns on the ground, an intersection of a row and a column is a 1×1 square,and a square is a valid place for players to put blocks on. And to simplify this problem, Nynako-san‘s blueprint can be represented as an integer array ci,j(1≤i≤n,1≤j≤m). Which ci,j indicates the height of his house on the square of i-th row and j-th column. The number of glass unit that you need to collect is equal to the surface area of Nyanko-san‘s house(exclude the face adjacent to the ground).

Input

The first line contains an integer T indicating the total number of test cases.
First line of each test case is a line with two integers n,m.
The n lines that follow describe the array of Nyanko-san‘s blueprint, the i-th of these lines has m integers ci,1,ci,2,...,ci,m, separated by a single space.

1≤T≤50
1≤n,m≤50
0≤ci,j≤1000

Output

For each test case, please output the number of glass units you need to collect to meet Nyanko-san‘s requirement in one line.

Sample Input

2
3 3
1 0 0
3 1 2
1 1 0
3 3
1 0 1
0 0 0
1 0 1

Sample Output

30
20Figure 2: A top view and side view image for sample test case 1.

Source

2015ACM/ICPC亚洲区长春站-重现赛(感谢东北师大)

题意:读入n行m列的矩阵,矩阵中存的是i行j列的房子的高度,每个房子是由1*1的砖块构成,问房子的表面积是多少,不包括底面。

思路:因为每个砖块有6个面,所以我们先初始房子总的表面积为总的砖块数*6。

有以下几种情况需要减去表面积:

1:房子与房子之间相邻时,减去它们公共的面的面积。

2:每个位置有房子时,减去底面面积。

3:每个房子上砖块与砖块之间相邻时,减去相邻砖块之间的两个面。

#include<stdio.h>
#include<iostream>
#include<algorithm>
using namespace std;
#define N 55
int map[N][N],Next[2][4]={0,1,1,0,-1,0,0,-1};
int main()
{
    int t,m,n,i,j,k,sum,ans,x,y;
    scanf("%d",&t);
    while(t --)
    {
        scanf("%d%d",&n,&m);
        sum = ans=0;
        for(i = 1; i <= n; i ++)
        {
            for(j = 1; j <= m; j ++)
            {
                scanf("%d",&map[i][j]);
                sum += map[i][j];//计算总的砖块数
                if(map[i][j]> 0)//ans记录底面面积总数
                    ans ++;
            }
        }
        sum *= 6;//初始化总的表面积
        for(i = 1; i <= n; i ++)
        {
            for(j = 1; j <= m; j ++)
            {
                if(map[i][j] > 0)//房子高度大于0时
                    sum = sum - (map[i][j]-1)*2;//每个房子上下相邻的砖块有(高度map[i][j]-1)块
                for(k = 0; k < 4; k ++)//搜索4个方向
                {
                    x = Next[0][k] + i;
                    y = Next[1][k] + j;
                    if(x < 1||y < 1||x>n||y>m)
                        continue;
                    sum -= min(map[x][y],map[i][j]);//减去两个房子相邻的公共部分面积
                }
            }
        }
        printf("%d\n",sum-ans);//总的表面积减去底面面积
    }
    return 0;
}
时间: 2024-08-06 16:02:16

hdu 5538 House Building 【矩阵表面积】的相关文章

hdu 5538 House Building(长春现场赛——水题)

题目链接:acm.hdu.edu.cn/showproblem.php?pid=5538 House Building Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 262144/262144 K (Java/Others) Total Submission(s): 621    Accepted Submission(s): 398 Problem Description Have you ever played the vid

HDU 5538 House Building(模拟——思维)

题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=5538 Problem Description Have you ever played the video game Minecraft? This game has been one of the world's most popular game in recent years. The world of Minecraft is made up of lots of 1×1×1 blocks

2015ACM/ICPC亚洲区长春站 L hdu 5538 House Building

House Building Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 262144/262144 K (Java/Others)Total Submission(s): 145    Accepted Submission(s): 123 Problem Description Have you ever played the video game Minecraft? This game has been one of t

HDU 5538 House Building 瞎搞

House Building Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 262144/262144 K (Java/Others)Total Submission(s): 1122    Accepted Submission(s): 689 Problem Description Have you ever played the video game Minecraft? This game has been one of

HDU 4887 Endless Punishment (矩阵离散对数)

题意: 给你两个长度为n(n <= 31)的01序列A, B,问A序列最少改变多少次能变成B序列.序列的一次改变是这样的,首先有两个集合S1.S2,每个集合中表示的都是下标,如果集合S1中1的个数是奇数个,那么把序列的第一个数去掉,然后在尾部加上一个数1,偶数个的话则是加上一个数0,然后将S2集合对应的位置异或一下,这就是改变了一次. 思路:由于n<=31,即可知总的不同序列个数是2^n.对于一个序列的一次改变,可以构造个转移矩阵,那么改变一次其实就是乘一次这个矩阵,设初始矩阵是A, 转移矩阵

HDU 4920 Matrix multiplication(矩阵相乘)

各种TEL,233啊.没想到是处理掉0的情况就可以过啊.一直以为会有极端数据.没想到竟然是这样的啊..在网上看到了一个AC的神奇的代码,经典的矩阵乘法,只不过把最内层的枚举,移到外面就过了啊...有点不理解啊,复杂度不是一样的吗.. Matrix multiplication Time Limit: 4000/2000 MS (Java/Others)    Memory Limit: 131072/131072 K (Java/Others) Total Submission(s): 640 

HDU 2604 Queuing (矩阵快速幂)

HDU 2604 Queuing (矩阵快速幂) ACM 题目地址:HDU 2604 Queuing 题意: n个人排队,f表示女,m表示男,包含子串'fmf'和'fff'的序列为O队列,否则为E队列,有多少个序列为E队列. 分析: 矩阵快速幂入门题. 下面引用巨巨解释: 用f(n)表示n个人满足条件的结果,那么如果最后一个人是m的话,那么前n-1个满足条件即可,就是f(n-1): 如果最后一个是f那么这个还无法推出结果,那么往前再考虑一位:那么后三位可能是:mmf, fmf, mff, fff

HDU 2254 奥运(矩阵快速幂+二分等比序列求和)

HDU 2254 奥运(矩阵快速幂+二分等比序列求和) ACM 题目地址:HDU 2254 奥运 题意: 中问题不解释. 分析: 根据floyd的算法,矩阵的k次方表示这个矩阵走了k步. 所以k天后就算矩阵的k次方. 这样就变成:初始矩阵的^[t1,t2]这个区间内的v[v1][v2]的和. 所以就是二分等比序列求和上场的时候了. 跟HDU 1588 Gauss Fibonacci的算法一样. 代码: /* * Author: illuz <iilluzen[at]gmail.com> * B

hdu 4920 Matrix multiplication(矩阵坑题)

http://acm.hdu.edu.cn/showproblem.php?pid=4920 被这道题虐了一下午,啥也不说了.继续矩阵吧. 超时就超在每步取余上,要放在最后取余,再者注意三个循环的次序. #include <stdio.h> #include <map> #include <set> #include <stack> #include <queue> #include <vector> #include <cma