/*

Antun Razum

XV. Gimnazija

Int Division

Contest 3

*/

 

#include <cstdio>

#include <cstring>

 

struct point

{

            point(void):r(-1),s(-1) {}

            point(int _r,int _s):r(_r),s(_s) {}

            ~point(void) {}

            void operator=(point _p)

            {

                        r=_p.r;

                        s=_p.s;

            }

            point operator+(point _p) const

            {

                        point r=(*this);

                        r.r+=_p.r;

                        r.s+=_p.s;

                        return r;

            }

            bool valid(point z) const

            {

                        if(r<0||r>=z.r||s<0||s>=z.s)

                                    return 0;

                       

                        return 1;

            }

           

            bool operator==(point _p) const { return (r==_p.r&&s==_p.s); }

           

            int r,s;

};

 

const int PN[2]={6,8},DN[2][2]={{2,2},{2,1}};

const point KOM[2][4][8]={

            {

                        {point(1,0),point(0,0),point(0,2),point(1,2),point(0,1),point(1,1)},

                        {point(0,0),point(0,1),point(2,1),point(2,0),point(1,1),point(1,0)},

                        {point(0,1),point(1,1),point(1,-1),point(0,-1),point(1,0),point(0,0)},

                        {point(1,1),point(1,0),point(-1,0),point(-1,1),point(0,0),point(0,1)}

            },

            {

                        {point(1,0),point(0,0),point(0,2),point(1,2),point(0,1),point(1,1),point(2,2),point(2,1)},

                        {point(0,0),point(0,1),point(2,1),point(2,0),point(1,1),point(1,0),point(2,-1),point(1,-1)},

                        {point(0,1),point(1,1),point(1,-1),point(0,-1),point(1,0),point(0,0),point(-1,-1),point(-1,0)},

                        {point(1,1),point(1,0),point(-1,0),point(-1,1),point(0,0),point(0,1),point(-1,2),point(0,2)}

            }

};

const point TPT[2][2]={

            {point(-1,-1),point(1,-1)},

            {point(-1,2),point(1,2)}

};

const point MP[4][2]={

            {point(0,0),point(0,-1)},

            {point(0,0),point(-1,0)},

            {point(0,0),point(0,1)},

            {point(0,0),point(1,0)}

};

 

void blokus(void);

int dot(point,point,int,int);

bool valid(point,int,int,point);

 

int main(void)

{

            for(int i=0;i<5;i++)

                        blokus();

}

 

void blokus(void)

{

            char r_in[100];

            int r,s,l1,l2;

            scanf("%s%d%d",r_in,&l1,&l2);

            r=9-(r_in[0]-'A');

            s=(r_in[1]-'0'-1);

            l1--;

            l2--;

           

            point z(11,11),gp(r,s);

            int u=0;

            for(int tpt=0;tpt<DN[0][l1];tpt++)

                        for(int tp=0;tp<2;tp++)

                                    for(int rot=0;rot<4;rot++)

                                    {

                                                point cr=gp+TPT[l1][tpt]+MP[rot][l2];

                                                if(dot(gp,cr,tp,rot)==1&&valid(cr,tp,rot,z))

                                                            u++;

                                    }

           

            printf("%d\n",u);

}

 

int dot(point gp,point sp,int tp,int rot)

{

            int r=0;

           

            for(int i=0;i<PN[0];i++)

                        for(int j=0;j<PN[tp];j++)

                                    if(KOM[0][0][i]+gp==KOM[tp][rot][j]+sp)

                                    {

                                                r++;

                                                break;

                                    }

           

            return r;

}

 

bool valid(point p,int tp,int rot,point z)

{

            for(int i=0;i<PN[tp];i++)

                        if(!(KOM[tp][rot][i]+p).valid(z))

                                    return 0;

           

            return 1;

}