P7956题解
我们可以想出:陨石下降的距离是陨石与地面的最小空气距离。
那么,代码就很简单了!
#include<bits/stdc++.h>
using namespace std;
int r,s,a[3010],b[3010],q=3010;//r行c列
char c[3010][3010];
int main() {
scanf("%d%d",&r,&s);
for (int i=1;i<=r;i++) {
for (int j=1;j<=s;j++) {
scanf(" %c",&c[i][j]);//输入字符
if (c[i][j]=='X') a[j]=i;//a[j]表示陨石底部在j列上的位置
if (c[i][j]=='#' && !b[j]) b[j]=i;//b[j]表示地面顶部在j列上的位置
}
}
for (int i=1;i<=s;i++) {
if (a[i]==0) continue;//需要特判一下,如果这一列上没有陨石,就不需要求陨石到地面的距离
q=min(b[i]-a[i]-1,q);//求陨石到地面的距离的最小值
}
for (int i=r;i>=1;i--) {
for (int j=s;j>=1;j--) {
if (c[i][j]=='X') c[i+q][j]='X',c[i][j]='.';//模拟陨石下降的过程,注意从下往上遍历,防止遍历重复,你也可以重新开一个数组存储
}
}
for (int i=1;i<=r;i++) {
for (int j=1;j<=s;j++) {
printf("%c",c[i][j]);//简单的输出字符
}
printf("\n");
}
return 0;
}