Falling Apples Kattis-apples (detailed notes)

topic

#include <iostream>
#include <stdio.h>
#include <stdlib.h>
#include <vector>
#include <stack>
#include <string.h>
#include <map>
#include <math.h>
#include <queue>
#include <set>
#include <algorithm>
#define MAX 0x3f3f3f3f
typedef long long ll;
using namespace std;
int n,m,k;
int visi[11];//判断该列是否有袋子(#)
int cnt_a[11];//遍历时当前袋子(#)往上的苹果数
int cnt[11];//每一列的苹果总数
char ans[50001][11];//结果输出
char a[50001][11]; //输入的数组
int main()
{
    
    
    cin>>n>>m;
    for(int i = 0 ;i < n;i++){
    
    
        for(int j = 0 ; j < m ; j++){
    
    
            cin>>a[i][j];
            if(a[i][j] == '#')
                visi[j] = 1;
            if(a[i][j] == 'a')
                cnt[j]++;
        }
    }
    for(int j = 0 ; j < m ; j++)
    {
    
    
        if(visi[j] == 0) //没有# 直接全部落下苹果
            for(int i = n - 1 ; i >= n  - cnt[j];i--)
                ans[i][j] = 'a';
        else{
    
     //有#         
            for(int i = 0 ; i < n ; i++)
            {
    
    
                if(a[i][j] == '#'){
    
     //把当前#上的苹果都落下
                    ans[i][j] = '#';
                    for(int k = i - 1 ;k >=i - cnt_a[j];k--)
                        ans[k][j] = 'a';
                    cnt_a[j] = 0;
                }
                else if(a[i][j] == 'a')
                    cnt_a[j]++;
            }
            if(cnt_a[j] != 0)//把剩余的苹果都落下
                for(int i = n - 1 ; i >= n-cnt_a[j];i--)
                    ans[i][j] = 'a';
        }
    }   
    for(int i = 0 ; i < n ; i++)
    {
    
    
        for(int j = 0 ; j < m ;j++)
        {
    
    
            if(ans[i][j] != 'a' && ans[i][j] !='#')
                cout<<".";
            else
                cout<<ans[i][j];
        }
        cout<<endl;
    }
    return 0;
}

Guess you like

Origin blog.csdn.net/qq_43567222/article/details/114829102