题解:P11020 「LAOI-6」Radiation
Hacker_Zcat · · 题解
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;
}
完结撒花!
编写不易,希望能给各位提供帮助,大家留个赞再走求求了。
求管理员过审,先拜谢一下。