题解:P11020 「LAOI-6」Radiation

· · 题解

1. 思路

简化题意:即要使我们摆放的石头占据更多的行和列。

若石头 k 比长宽 (n,m) 少,则我们需要尽量占据更多,即使每行每列至多有一个石头。

若石头 k 比长宽 (n,m) 多,则先按照刚才的顺序去摆放,然后再依次填充即可

注:不要与之前摆过的石头重叠。

2. 程序编写

1. 初始化棋盘:

将棋盘变为空。

for(i=1;i<=n;i++){
    for(j=1;j<=m;j++){
        board[i][j]='.'; 
    }
}

2. 以对角线填充石头及判断是否有剩余:

for(i = 1; i <=min(n, min(m,k)); ++i) {
    board[i][i] = 'S';
}
int remainingStones = k - min(n, m);
i=1;
j=1;

3. 若有剩余,继续填充:

while(remainingStones>0){
        if(board[i][j]!='S'){
            board[i][j]='S';
            remainingStones--;
        }
        j++;
        if(j>m){
            j=1;
            i++;
        }
    }

最后展示完整 AC 代码:

#include <bits/stdc++.h>
using namespace std;
char board[10005][10005];
int i,j,n,m,k,a,b,T;
void startboard(int n,int m){
    for(i=1;i<=n;i++){//初始化棋盘
        for(j=1;j<=m;j++){
            board[i][j]='.'; 
        }
    }
    for(i = 1; i <=min(n, min(m,k)); ++i) {//对角线填充
        board[i][i] = 'S';
    }
    int remainingStones = k - min(n, m);//石头数量减少
    i=1;
    j=1;
    while(remainingStones>0){//填充剩余石头
        if(board[i][j]!='S'){
            board[i][j]='S';
            remainingStones--;
    }
    j++;
    if(j>m){//换行
        j=1;
        i++;
    }
    }
}
int main(){
    cin >>T;
    while (T--){
        cin>>n>>m>>k;//输入
        startboard(n,m);
        for(int i=1;i<=n;i++){//输出
            for(int j=1;j<=m;j++){
                cout<<board[i][j];
        }
        cout<<"\n";
        }
    }
    return 0;
}

完结撒花!

编写不易,希望能给各位提供帮助,大家留个赞再走求求了。

求管理员过审,先拜谢一下。