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 C# (judge verdict: Accepted)

using System;
using System.Linq;
using System.Collections.Generic;


namespace Test1 {



    class ClassMain {


        public static void Main(String[] args) {
            string line;
            while ((line = Console.ReadLine()) != null) {
                //int[] ints = line.Split(' ').Select(int.Parse).ToArray();
                //int n = ints[0];
                int n = int.Parse(line);
                if(n==0){break;}

                //int[] ints = Console.ReadLine().Split(' ').Select(int.Parse).ToArray();
                string[] strs = Console.ReadLine().Split(' ');
                char s = strs[0][0];
                char t = strs[1][0];
                char b = strs[2][0];


                double[,] yasiki = new double[3, 3];
                int indexS = s - 'A';
                yasiki[indexS / 3, indexS % 3] = 1.0;
                int indexB = b - 'A';
                yasiki[indexB / 3, indexB % 3] = 0.0;

                

                while (n-- > 0) {
                    double[,] newyasiki = new double[3, 3];
                    newyasiki[indexB / 3, indexB % 3] = -1.0;

                    if (newyasiki[0, 0] > -0.5) {
                        newyasiki[0, 0] = yasiki[0, 1] * 0.25 + yasiki[1, 0] * 0.25;
                        newyasiki[0, 0] += yasiki[0, 0] * 0.5;
                    }
                    if (newyasiki[0, 1] > -0.5) {
                        newyasiki[0, 1] = yasiki[0, 0] * 0.25 + yasiki[0, 2] * 0.25 
                            + yasiki[1, 1] * 0.25;
                        newyasiki[0, 1] += yasiki[0, 1] * 0.25;
                    }
                    if (newyasiki[0, 2] > -0.5) {
                        newyasiki[0, 2] = yasiki[0, 1] * 0.25 + yasiki[1, 2] * 0.25;
                        newyasiki[0, 2] += yasiki[0, 2] * 0.5;
                    }
                    if (newyasiki[1, 0] > -0.5) {
                        newyasiki[1, 0] = yasiki[0, 0] * 0.25 + yasiki[2, 0] * 0.25 + 
                            yasiki[1, 1] * 0.25;
                        newyasiki[1, 0] += yasiki[1, 0] * 0.25;
                    }
                    if (newyasiki[1, 1] > -0.5) {
                        newyasiki[1, 1] = yasiki[0, 1] * 0.25 + yasiki[1, 0] * 0.25
                            + yasiki[1, 2] * 0.25 + yasiki[2, 1] * 0.25;
                    }
                    if (newyasiki[1, 2] > -0.5) {
                        newyasiki[1, 2] = yasiki[0, 2] * 0.25 + yasiki[1, 1] * 0.25
                            + yasiki[2, 2] * 0.25;
                        newyasiki[1, 2] += yasiki[1, 2] * 0.25;
                    }
                    if (newyasiki[2, 0] > -0.5) {
                        newyasiki[2, 0] = yasiki[2, 1] * 0.25 + yasiki[1, 0] * 0.25;
                        newyasiki[2, 0] += yasiki[2, 0] * 0.5;
                    }
                    if (newyasiki[2, 1] > -0.5) {
                        newyasiki[2, 1] = yasiki[2, 0] * 0.25 + yasiki[2, 2] * 0.25
                            + yasiki[1, 1] * 0.25;
                        newyasiki[2, 1] += yasiki[2, 1] * 0.25;
                    }
                    if (newyasiki[2, 2] > -0.5) {
                        newyasiki[2, 2] = yasiki[2, 1] * 0.25 + yasiki[1, 2] * 0.25;
                        newyasiki[2, 2] += yasiki[2, 2] * 0.5;

                    }
                    
                    
                    if (indexB == 0) {
                        newyasiki[0, 1] += 0.25 * yasiki[0, 1];
                        newyasiki[1, 0] += 0.25 * yasiki[1, 0];
                    }
                    if (indexB == 1) {
                        newyasiki[0, 0] += 0.25 * yasiki[0, 0];
                        newyasiki[1, 1] += 0.25 * yasiki[1, 1];
                        newyasiki[0, 2] += 0.25 * yasiki[0, 2];
                    }
                    if (indexB == 2) {
                        newyasiki[0, 1] += 0.25 * yasiki[0, 1];
                        newyasiki[1, 2] += 0.25 * yasiki[1, 2];
                    }


                    if (indexB == 3) {
                        newyasiki[0, 0] += 0.25 * yasiki[0, 0];
                        newyasiki[1, 1] += 0.25 * yasiki[1, 1];
                        newyasiki[2, 0] += 0.25 * yasiki[2, 0];
                    }
                    if (indexB == 4) {
                        newyasiki[0, 1] += 0.25 * yasiki[0, 1];
                        newyasiki[1, 0] += 0.25 * yasiki[1, 0];
                        newyasiki[1, 2] += 0.25 * yasiki[1, 2];
                        newyasiki[2, 1] += 0.25 * yasiki[2, 1];
                    }
                    if (indexB == 5) {
                        newyasiki[0, 2] += 0.25 * yasiki[0, 2];
                        newyasiki[1, 1] += 0.25 * yasiki[1, 1];
                        newyasiki[2, 2] += 0.25 * yasiki[2, 2];
                    }
                    if (indexB == 6) {
                        newyasiki[2, 1] += 0.25 * yasiki[2, 1];
                        newyasiki[1, 0] += 0.25 * yasiki[1, 0];
                    }
                    if (indexB == 7) {
                        newyasiki[2, 0] += 0.25 * yasiki[2, 0];
                        newyasiki[1, 1] += 0.25 * yasiki[1, 1];
                        newyasiki[2, 2] += 0.25 * yasiki[2, 2];
                    }
                    if (indexB == 8) {
                        newyasiki[2, 1] += 0.25 * yasiki[2, 1];
                        newyasiki[1, 2] += 0.25 * yasiki[1, 2];
                    }

                    for (int i = 0; i < 3; i++) for (int j = 0; j < 3; j++) {
                        yasiki[i, j] = newyasiki[i, j];
                        }
                    yasiki[indexB / 3, indexB % 3] = 0.0;
                   
                }

                int indexT = t - 'A';
                double prob = yasiki[indexT / 3, indexT % 3];
                Console.WriteLine(prob);


            }
            
        }

        
    }

    

    
}