题解:P11020 「LAOI-6」Radiation
提供一个不需要用数组的解法
不用忍受 memset 的痛苦
因为宇宙射线一次只能摧毁一行或一列的石头,再观察子任务一发现
1. k \ge \min (n,m)
思路:
将
无数组实现:
1. 对角线摆放实现只需在循环
2. 将
3. 在可随意摆放的石头用完之后,只要 .。
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)
思路及实现:
因为 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 求求乐。