正方形积木

Description

zyf有一堆的1x1x1的正方体积木,他在一个n*m的网格的每个格子上随便堆积了若干个积木。如图所示:
1 2 3 4
0 5 7 0
0 1 1 0
2 1 0 1
4*4的网格上,每个网格位置上的数字表示这个位置有多少个网格堆积,求这些积木裸露在外面的面积。

Input

输入数据的第一行有一个整数T,表示有T组测试数据。
每组数据的第一行有两个整数,代表n 和 m (0< n,m <100),
接下来有n行,每行m个整数,表示这个位置堆积积木的个数i(0 <= i <= 100)。

Output

输出一个整数,表示这些积木裸露在外面的面积。
每组测试数据输出一行。

Sample Input

1
4 4
1 2 3 5
0 5 7 0
0 1 1 0
2 1 0 1

Sample Output

85
#include<stdio.h>
#include<string.h>
int get_max(int num1,int num2);
int main(void){
	int num1,a[110][110],sum;
	int i,j,m,n;
	scanf("%d",&num1);
	while(num1--){
		sum=0;
		memset(a,0,sizeof(a));
		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++){
				if(a[i][j]!=0){
				sum++;//顶上的面
				}
					sum+=get_max(a[i][j]-a[i][j-1],0);左边的面
					sum+=get_max(a[i][j]-a[i][j+1],0);右边的面
					sum+=get_max(a[i][j]-a[i+1][j],0);前面的面
					sum+=get_max(a[i][j]-a[i-1][j],0);后面的面
			}
		}
		printf("%d\n",sum);	
	}
}
int get_max(int num1,int num2){
	if(num1<=num2){
		return num2;
	}
	else{
		return num1;
	}
}

楼梯(stair) 1.0s 256MB 展开 题目描述 聪聪的游戏全校同学都很喜欢,老师表扬了聪聪。放学回家以后,发现小表弟在家,妈妈告诉表弟:“聪聪哥哥特别会玩游戏,你让聪聪哥哥陪你玩啊!,小表弟就拿出他的积木”让聪聪陪他玩,聪聪开始不想在家陪表弟,他想同学出去玩呢,可是妈妈说,如果陪表弟玩开心了,周末就带他去游乐场。听了这话,聪聪就跟妈妈保证,一定好好陪小表弟玩。聪聪一边拿着表弟的积木,一边在想,平常的游戏表弟都玩腻了,有什么新的好玩的呢。不一会聪聪就想到了,小表弟的这组积木有个底盘,是由很多方格组成的,积木中正好有一些与方格大小相同的正方形积木,聪聪小表弟一起按如下规则将这些正方形积木摆放在底盘上:底盘的每一竖行方格组成一列,必须从最左边的一列开始摆放,每列从最下面的方格开始连续摆放积木,底盘至少要放两列,后一列放的积木数至少比前一列多一个。下图为 5个积木所能摆放的出的情况。聪聪一边教表弟一边摆出不同积木数的各种情况。 说明 这个游戏启发了聪聪,他想:如果积木底盘无限大,当积木数很多时,能摆放的情况就有很多很多,你能计算出有 N 个积木时按照上述规则能摆放出多少种情况吗? 输入格式 输入文件为一个正整数 N(N≥3),表示积木个数。 输出格式 输出文件一个正整数,表示能摆放出的情况数。 样例 输入#1 5 Copy 输出#1 2 Copy 数据范围 对于 40%的数据满足 N≤10; 对于 80%的数据满足 N≤100; 对于 100%的数据满足 N≤200。 这是代码: #include<bits/stdc++.h> #define ll long long using namespace std; ll f[210][210][210],ans,s[210];//放i列,第i列的积木数为j,已经放了k个 int n,m; int main(){ cin>>n; for(int i=1;i<=n;i++){ s[i]=s[i-1]+i; if(s[i]>n){ m=i-1; break; } } for(int i=1;i<=n;i++)f[1][i][i]=1; for(int i=2;i<=m;i++) for(int j=i;j<=n;j++) for(int k=s[i];k<=n;k++) // if(j>k-j) { for(int l=i-1;l<=j;l++) if(j>l)f[i][j][k]+=f[i-1][l][k-j]; // printf("放%d列,第%d列的积木数为%d,已经放了%d个:%d\n",i,i,j,k,f[i][j][k]); } for(int i=2;i<=m;i++) for(int j=i;j<=n;j++)ans+=f[i][j][n]; cout<<ans; return 0; }
最新发布
07-12
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值