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: Wrong Answer)

import java.util.*;

public class Main {
	Scanner in = new Scanner(System.in);
	public static void main(String[] args) {
		new Main();
	}

	public Main() {
		new AOJ1020().doIt();
	}

	class AOJ1020{
		int[][][] dp;
		void print(int b){
			System.out.println();
			for(int i=0;i<3;i++){
				for(int j=0;j<3;j++)System.out.print(dp[i][j][b]+" ");
				System.out.println();
			}
			System.out.println();
		}

		void doIt(){
			HashMap<Character,Point> map = new HashMap<Character,Point>();
			map.put('A',new Point(0, 0));
			map.put('B',new Point(1, 0));
			map.put('C',new Point(2, 0));
			map.put('D',new Point(0, 1));
			map.put('E',new Point(1, 1));
			map.put('F',new Point(2, 1));
			map.put('G',new Point(0, 2));
			map.put('H',new Point(1, 2));
			map.put('I',new Point(2, 2));
			int sx[] = {1,0,-1,0};
			int sy[] = {0,1,0,-1};
			while(true){
				int n = in.nextInt();
				if(n==0)break;
				char s = in.next().charAt(0);
				char t = in.next().charAt(0);
				char b = in.next().charAt(0);
				Point bad = map.get(b);
				dp = new int[3][3][n+2];
				dp[map.get(s).y][map.get(s).x][0] = 1;
				for(int i=0;i<n;i++){
					for(int y=0;y<3;y++)for(int x=0;x<3;x++)if(dp[y][x][i]>0){
						for(int j=0;j<4;j++){
							int nx = x+sx[j];
							int ny = y+sy[j];
							if(nx<0||nx>=3||ny<0||ny>=3)dp[y][x][i+1]++;
							else if(bad.x==nx&&bad.y==ny)dp[y][x][i+1]++;
							else{
								dp[ny][nx][i+1]++;
							}
						}
					}
//					print(i);
				}
				
				double sum = 0;
				double goal = dp[map.get(t).y][map.get(t).x][n];
				for(int i=0;i<3;i++)for(int k=0;k<3;k++)sum+=dp[i][k][n];
				System.out.printf("%.9f\n",(goal/sum));
			}
		}
		class Point{
			int x,y;
			public Point(int x,int y) {
				this.x = x;
				this.y = y;
			}
		}

	}


}