题解 CF2094F

· · 题解

题意

给定 n\times m 格子,往里面填入 [1,k] 的整数,使得各个整数出现次数相同且相同整数不相邻。

思路

简单构造。我们观察 k=2 的情况,不难发现这个结果其实非常容易满足。

如果按照横平竖直的顺序,依次填入 [1,k],在很多情况下就可以满足条件。唯一一点例外是当 mk 的倍数时,每一横行的所有数都会相同。

严谨一点说,当 m 不是 k 的倍数时,依次填入 [1,k],由于 k\ge 2,所以一个数左右两边一定是与此数不同的。而上下的数由于存在余数的缘故,也一定不同。

因此特判 mk 的倍数的情况,将一行所有数平移一格并将头部数字放到尾部即可。

程序如下

#include<cstdio>
#include<cstring>
using namespace std;
int T,n,m,k;
int main(){
    scanf("%d",&T);
    while(T--){
        scanf("%d%d%d",&n,&m,&k);
        int cur=0;
        for(int i=1;i<=n;i++){
            if(m%k==0&&i%2==0){
                cur++;
                for(int i=1;i<=m;i++)printf("%d ",(++cur)%k+1);
                cur--;
            }
            else
                for(int i=1;i<=m;i++)
                    printf("%d ",(++cur)%k+1);
            puts("");
        }
    }
    return 0;
}

THE END