题解:P11020 「LAOI-6」Radiation

· · 题解

提供一个不需要用数组的解法

不用忍受 memset 的痛苦

因为宇宙射线一次只能摧毁一行或一列的石头,再观察子任务一发现 k \le \min (n,m),由此可以想到小 U 的宇宙射线在任何时间只需使用 \min (n,m) 次,所以分为两种情况求解。

1. k \ge \min (n,m)

思路:

将 \min (n,m) 个石头先摆放在不同的行和列(以下称为对角线摆放),将剩下的 k- \min (n,m) 个石头随意摆放即可。

无数组实现:

1. 对角线摆放实现只需在循环 i=j 时放置石头。

2. 将 k- \min (n,m) 表示为在对角线摆放后可随意摆放的石头的数量,在未被对角线摆放的石头占用的格子摆放即可,即 i≠j 时摆放。

3. 在可随意摆放的石头用完之后,只要 i≠j 便输出 .。

if(k>=min(n,m)){
    k-=min(n,m);//可随意摆放石头个数
    for(int i=1;i<=n;i++){
        for(int j=1;j<=m;j++){
            if(i!=j&&cnt<k) {printf("S"); cnt++;}
            //cnt表示已摆放的可随意摆放石头的个数
            else if(i==j) printf("S");
            else printf(".");
        }
    printf("\n");
    }
}

2. k< \min (n,m)

思路及实现:

因为 k< \min (n,m),所以并没有可随意摆放的石头,现将 cnt 表示为已摆放石头的个数,只需在 i==j&&cnt < k 时摆放石头即可。

else{
    for(int i=1;i<=n;i++){
        for(int j=1;j<=m;j++){
                if(i==j&&cnt<k) {printf("S"); cnt++;}
                //只要cnt<k就是石头还没有摆完
                else printf(".");
            }
        printf("\n");
    }
}

C++ 代码:

#include<cstdio>
#include<iostream>
using namespace std;
inline int read(){
    char c=getchar(); int t=1,k=0;
    while('0'>c||c>'9'){if(c=='-') t=-1; c=getchar();}
    while('0'<=c&&c<='9'){k=k*10+(c^48); c=getchar();}
    return 0;
}
int t,n,m,k,cnt;
int main(){
    t=read();
    while(t--){
        n=read(),m=read(),k=read();
        cnt=0;
        if(k>=min(n,m)){
            k-=min(n,m);
            for(int i=1;i<=n;i++){
                for(int j=1;j<=m;j++){
                    if(i!=j&&cnt<k) {printf("S"); cnt++;}
                    else if(i==j) printf("S");
                    else printf(".");
                }
            printf("\n");
            }
        }
        else{
            for(int i=1;i<=n;i++){
                for(int j=1;j<=m;j++){
                    if(i==j&&cnt<k) {printf("S"); cnt++;}
                    else printf(".");
                }
            printf("\n");
            }
        }
    }
    return 0;
}
//by:HeartBeast

听说 csp 前写题解可以加 rp ,也祝各位看到此篇题解的 oier 们 rp++。

本蒟蒻第一次写题解,求管理大大多多包容,orz 求求乐。