Problem:
Problem B: Cleaning Robot

Dr. Asimov, a robotics researcher, loves to research, but hates houseworks and his house were really dirty. So, he has developed a cleaning robot.

As shown in the following figure, his house has 9 rooms, where each room is identified by an alphabet:

The robot he developed operates as follows:

If the battery runs down, the robot stops.

If not so, the robot chooses a direction from four cardinal points with the equal probability, and moves to the room in that direction. Then, the robot clean the room and consumes 1 point of the battery.

However, if there is no room in that direction, the robot does not move and remains the same room. In addition, there is a junk room in the house where the robot can not enter, and the robot also remains when it tries to enter the junk room. The robot also consumes 1 point of the battery when it remains the same place.

A battery charger for the robot is in a room. It would be convenient for Dr. Asimov if the robot stops at the battery room when its battery run down.

Your task is to write a program which computes the probability of the robot stopping at the battery room.

Input

The input consists of several datasets. Each dataset consists of:

n
s t b

n is an integer that indicates the initial battery point. s, t, b are alphabets respectively represent the room where the robot is initially, the battery room, and the junk room.

The input ends with a dataset which consists of single 0 for n. Your program should not output for this dataset.

Output

For each dataset, print the probability as a floating point number in a line. The answer may not have an error greater than 0.000001.

Constraints

Judge data includes at most 100 data sets.

n ≤ 15

s, t, b are distinct.

Sample Input

1
E A C
1
E B C
2
E A B
0

Output for the Sample Input

0.00000000
0.25000000
0.06250000

Solution in JAVA (judge verdict: Accepted)

import java.io.*;
import java.util.*;
import java.math.*;
public class Main{
        public static void main(String[] arg) throws IOException {
                BufferedReader in = new BufferedReader(new InputStreamReader(System.in));
                String[] ia; 

                while(true){
                        n = Integer.parseInt(in.readLine());
                        if(n == 0){ 
                                break;
                        }   
                        ia = in.readLine().split(" ");
                        s = ia[0].charAt(0) - 'A';
                        t = ia[1].charAt(0) - 'A';
                        b = ia[2].charAt(0) - 'A';
                        e = 0;
                        f = 0;
                        x = new Integer[9][16][2];
                        check(n, s); 
                        System.out.printf("%.8f\n",(double) x[s][n][0]/x[s][n][1]);
                }   
        }   
        static int n;
        static int s;
        static int t;
        static int b;
        static Integer[][][] x;
        static int e;
        static int f;
        static class pair{
                int a;
                int b;
                pair(Integer s, Integer t){ 
                        a = s;
                        b = t;
                }   
                pair(int s, int t){ 
                        a = s;
                        b = t;
                }   
                void add(pair s){ 
                        this.a += s.a;
                        this.b += s.b;
                }
        }
        static pair check(int g, int h){
                if(x[h][g][0] != null){
                        return new pair(x[h][g][0],x[h][g][1]);
                }
                pair p = new pair(0,0);
                if(g == 0){
                        p.b++;
                        if(h == t){
                                p.a++;
                        }
                } else {
                        if(2 < h){
                                if(h-3 != b){
                                        p.add(check(g-1, h-3));
                                } else {
                                        p.add(check(g-1, h));
                                }
                        } else {
                                p.add(check(g-1, h));
                        }
                        if(0 < h%3){
                                if(h-1 != b){
                                        p.add(check(g-1, h-1));
                                } else {
                                        p.add(check(g-1, h));
                                }
                        } else {
                                p.add(check(g-1, h));
                        }
                        if(h%3 < 2){
                                if(h+1 != b){
                                        p.add(check(g-1, h+1));
                                } else {
                                        p.add(check(g-1, h));
                                }
                        } else {
                                p.add(check(g-1, h));
                        }
                        if(h < 6){
                                if(h+3 != b){
                                        p.add(check(g-1, h+3));
                                } else {
                                        p.add(check(g-1, h));
                                }
                        } else {
                                p.add(check(g-1, h));
                        }
                }
                x[h][g][0] = p.a;
                x[h][g][1] = p.b;
                return p;
        }
}