#include <iostream>
#include <fstream>

using namespace std;

void fall(char * );
void draw(char * );

const char * level =
"                                                                                "
"                                                                                "
"                                                                                "
"                                                                                "
"       @                                                                        "
"                                                                                "
"                                                                                "
"                                                                                "
"                                                                                "
"                                                                                "
"                                                                                "
"************                                                   ****************#"
"#*****************                                           ***********########"
"#******************~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~***************#######"
"###*****************~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~**************##########"
"######****************~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*************#############"
"#########**************~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~***********################"
"###############********~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~******#####################"
"############################~~~~~~~~~~~~~~~~~~~~~~~#############################"
"################################################################################"
"################################################################################";

int main()
{
    char * grid = new char[1600];
    for (int i=0;i<1600;i++)
        *(grid+i) = *(level+i);

    char cont = 'O';
    while (cont != 'Q')
    {
        fall(grid);
        draw(grid);
        cont = toupper(cin.get());
    }

    delete grid;
    return 0;
}

void xchg(char * grid, int src, int dest)
{
    char tmp = *(grid + src);
    *(grid + src) = *(grid + dest);
    *(grid + dest) = tmp;
}

void fall(char * grid)
{
    //1600 minus 80
    for (int i=0;i<1520;i++)
    {
        switch (*(grid+i))
        {
        case '~':
            if (*(grid + i + 80) == ' ')
                xchg(grid,i,i+80);
            else if (*(grid +i -1) == ' ' && i%80>0)
                xchg(grid,i,i-1);
            else if (*(grid +i +1) == ' ' && i%80<79)
                xchg(grid,i,i+1);
            break;
        case '*':
            if (*(grid +i +80) == ' ' || *(grid+i+80)=='~')
                xchg(grid,i,i+80);
            else if (*(grid +i +79) == ' ' && i%80>0)
                xchg(grid,i,i+79);
            else if (*(grid +i +81) == ' ' && i%80<79)
                xchg(grid,i,i+81);
            break;
        case '@':
            if (*(grid+i+80)==' ' || *(grid+i+80)=='~')
                xchg(grid,i,i+80);
        }
    }
}

void shoot()
{

}

void draw(char * grid)
{
    for (int i=0; i<1600;i++)
    {
        if (i%80==0)
            cout << '\n';
        else
            cout << *(grid+i);
    }
    cout << '\n';
}