2014ACM集训13级PK赛4-K-Nice

Description

This is a super simple problem. The description is simple, the solution is simple. If you believe so, just read it on. Or if you don't, just pretend that you can't see this one.

We say an element is inside a matrix if it has four neighboring elements in the matrix (Those at the corner have two and on the edge have three). An element inside a matrix is called "nice" when its value equals the sum of its four neighbors. A matrix is called "k-nice" if and only if k of the elements inside the matrix are "nice".

Now given the size of the matrix and the value of k, you are to output any one of the "k-nice" matrix of the given size. It is guaranteed that there is always a solution to every test case.

Input

The first line of the input contains an integer T (1 <= T <= 8500) followed by T test cases. Each case contains three integers n, m, k (2 <= n, m <= 15, 0 <= k <= (n - 2) * (m - 2)) indicating the matrix size n * m and it the "nice"-degree k.

Output

For each test case, output a matrix with n lines each containing m elements separated by a space (no extra space at the end of the line). The absolute value of the elements in the matrix should not be greater than 10000.

Sample Input

2
4 5 3
5 5 3

Sample Output

2 1 3 1 1
4 8 2 6 1
1 1 9 2 9
2 2 4 4 3
0 1 2 3 0
0 4 5 6 0
0 0 0 0 0
0 0 0 0 0
0 0 0 0 0


其实这个题挺坑的,如果想得太多反而不好实现,想一下,如果是一个数等于四个方向之和,最好实现的是什么,最后一个标准输出发现了,是4个0相加等于0,那么只要凑够k个符合条件的0就可以了,那么这k个符合条件的0会出现在那里呢?

观察一下,据对是在(2,2)(2,m - 1)(n - 1,2)(n - 1,m - 1)这个范围内,以保证出现4个0环绕一个0,然后,在其中选取k个符合条件的位置,再把其他位置填充为不符合条件的数字就可以了。

至于如何不符合条件,递增数列啊,这样就保证一个数周围的数一个比它小,一个比他大,这样就不能符合nice条件了。

于是,神奇的代码就这样诞生了,虽然和标准答案不一样,但是A了,啊哈哈。

#include <string.h>
#include <stdio.h>
#include <math.h>
#include <stdlib.h>

int main()
{
    int N;
    scanf ("%d",&N);

    while (N--)
    {
        int n,m,k,i,j;
        int num = 1;
        scanf("%d%d%d", &n, &m, &k);
        k = (n-2)*(m-2) - k;
        for(i = 1; i <= n; i++)
        {
            printf("0");
            for(j=1; j<=m-2; j++)
                if(k>0)
                    printf(" %d",num++,k--);
                else
                    printf(" 0");
            printf(" 0\n");
        }
    }
        return 0;
    }


 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值