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

1 2 3 4 5 6 7 1 2 0 1

Sample Output

19 9
#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)    收藏  举报

导航