1 条题解

  • 0
    @ 2025-8-24 22:34:38

    自动搬运

    查看原文

    来自洛谷,原作者为

    avatar Dea_He
    凉仙贝!你就是一只可可爱爱的蓝莓巧克力小蛋糕(❁´◡`❁)

    搬运于2025-08-24 22:34:38,当前版本为作者最后更新于2021-11-20 23:20:53,作者可能在搬运后再次修改,您可在原文处查看最新版

    自动搬运只会搬运当前题目点赞数最高的题解,您可前往洛谷题解查看更多

    以下是正文


    我们可以想出:陨石下降的距离是陨石与地面的最小空气距离。

    那么,代码就很简单了!

    #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;
    }
    
    • 1

    信息

    ID
    7283
    时间
    1000ms
    内存
    64MiB
    难度
    2
    标签
    递交数
    0
    已通过
    0
    上传者