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 an×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 aren 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 arrayci,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 integersn,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
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
30 20Figure 2: A top view and side view image for sample test case 1. ![]()
//1.注意分析,每个立方体底面一定不装玻璃,求得共有多少个立方体得总面数并减去底面#include <bits/stdc++.h> using namespace std; int a[55][55]; int main() { int t,s,n,m,i,j; scanf("%d",&t); while(t--) { memset(a,0,sizeof(a)); s=0; scanf("%d%d",&n,&m); for(i=1; i<=n; i++) { for(j=1; j<=m; j++) { scanf("%d",&a[i][j]); } } for(i=1; i<=n; i++) { for(j=1; j<=m; j++) { s=s+a[i][j]; } } s=s*5; for(i=1; i<=n; i++) { for(j=1; j<=m; j++) { if(a[i][j]!=0) { s=s-a[i][j]+1; if(i+1<=n) { if(a[i+1][j]==0) { s=s+0; } else if(a[i+1][j]<a[i][j]) { s=s-a[i+1][j]; } else if(a[i+1][j]>=a[i][j]) { s=s-a[i][j]; } } if(j+1<=m) { if(a[i][j+1]==0) { s=s+0; } else if(a[i][j+1]<a[i][j]) { s=s-a[i][j+1]; } else if(a[i][j+1]>=a[i][j]) { s=s-a[i][j]; } } if(i-1>=1) { if(a[i-1][j]==0) { s=s+0; } else if(a[i-1][j]<a[i][j]) { s=s-a[i-1][j]; } else if(a[i-1][j]>=a[i][j]) { s=s-a[i][j]; } } if(j-1>=1) { if(a[i][j-1]==0) { s=s+0; } else if(a[i][j-1]<a[i][j]) { s=s-a[i][j-1]; } else if(a[i][j-1]>=a[i][j]) { s=s-a[i][j]; } } } } } printf("%d\n",s); } return 0; }
//2.n×m个点上下左右四个方向去找是否有邻接立方体,若有根据两者
//高度的大小关系分析被占据的面的个数