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;
}