BNUZH OJ 2012网络赛堆积木
锴哥堆积木
Time Limit: 1 Sec Memory Limit: 128 MB
Description
话说锴哥小时候很喜欢玩积木,精通各种积木的玩法。
我们现在回溯到锴哥小时候,有一天,锴哥突发奇想,要用1*1*1的小方块自己做一套积木,于是锴哥精心绘制了新积木每个部件的三视图,规格都是N*N。可是,不幸却发生了,锴哥的图纸有两张不翼而飞,只剩下顶视图。锴哥当然不会善罢甘休,他用传说中随机算法,生成了一张N*N的数表,表示最底层木块的价值,对于竖直方向的木块的价值,由下到上按公差为D = —max(i,j)成等差数列,i、j表示数表中某位置的的横纵坐标(1<= i <= N ,1<= j <= N)。锴哥现在要按照顶视图把价值最大的积木选出来,显然这是唯一确定的,并称这个价值为锴氏价值。当然了,积木必须是完整的,为此锴哥买了胶水去把相互接触的小方块表面用胶水粘起来。由于把每两个小正方体面粘起来的花费是固定的C,锴哥立即就能算出胶水的总花费。但锴哥有很多有很多图纸,所以请你来帮锴哥解答。
样例:

结果不会超过int的范围。
Input
第一行包含一个整数T(1<=T<=20),表示测试数据组数。
对于每次测试数据,包含若干行。
第一行给出两个数N(1<=N<=50)和C(1<=N<=10)表示数表规模和花费。
接下来N行给出一个N*N的数表,表示锴哥的随机数表,表示(i,j)位置的随机数。
然后N行给出一个或积木部件顶视图,表示(i,j)位置竖直方向的方块数。
Output
对于每组测试数据输出一行,包含两个数。分别表示锴哥所制作积木的的锴氏价值和总花费,用空格隔开。
Sample Input
Sample Output
#include<stdio.h> int max1(int a,int b) { if(a>=b)return a; else return b; } int main() { int T; scanf("%d",&T); while(T--) { int n,c; scanf("%d %d",&n,&c); int a[n+1][n+1]; int d[n+1][n+1]; int i,j,k; for(i=1;i<=n;i++) { for(j=1;j<=n;j++) { scanf("%d",&a[i][j]); d[i][j]=-max1(i,j); } } int b[n+1][n+1]; int b3[n+2][n+2][n+2]; for(i=0;i<=n+1;i++) //初始化三维数组 { for(j=0;j<=n+1;j++) { for(k=0;k<=n+1;k++)b3[i][j][k]=0; } } int ksum=0,csum; //kai价值 总价值 for(i=1;i<=n;i++) { for(j=1;j<=n;j++) { scanf("%d",&b[i][j]); for(k=1;k<=b[i][j];k++)b3[i][j][k]=1; ksum+=b[i][j]*a[i][j]+b[i][j]*(b[i][j]-1)*d[i][j]/2; } } int face=0; //遍历统计面数 for(i=1;i<=n;i++) { for(j=1;j<=n;j++) { for(k=1;k<=n;k++) { if(b3[i][j][k+1]==1&&b3[i][j][k]==1)face++; if(b3[i][j][k-1]==1&&b3[i][j][k]==1)face++; if(b3[i][j+1][k]==1&&b3[i][j][k]==1)face++; if(b3[i][j-1][k]==1&&b3[i][j][k]==1)face++; if(b3[i+1][j][k]==1&&b3[i][j][k]==1)face++; if(b3[i-1][j][k]==1&&b3[i][j][k]==1)face++; } } } csum=c*face/2; printf("%d %d\n",ksum,csum); } return 0; }
posted on 2012-11-21 12:10 Aquariuslt 阅读(272) 评论(0) 收藏 举报
浙公网安备 33010602011771号