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.Collections.Generic;
using System.Text;

class TEST{
	static void Main(){
		while(true){
			var d=int.Parse(Console.ReadLine());
			if(d==0)break;
			Sol mySol=new Sol(d);
			Console.WriteLine("{0,10:F8}",mySol.Ans);
		}
	}
}

class Sol{
	double ans;
	public double Ans{
		get{return ans;}
	}
	
	
	public Sol(int d){
		double[,][] P=new double[3,3][];
		for(int i=0;i<9;i++)P[i%3,i/3]=new double[d+1];
		
		var ss=Console.ReadLine().Split(' ');
		int posS;
		int posT;
		int posB;
		
		for(int i=0;i<9;i++)P[i%3,i/3][0]=0;
		posS=(int)(ss[0][0]-'A');
		posT=(int)(ss[1][0]-'A');
		posB=(int)(ss[2][0]-'A');
		
		P[posS%3,posS/3][0]=1.0;
		
		double[,][] Pd=new double[3,3][];
		for(int i=0;i<9;i++){
			int x=i%3;
			int y=i/3;
			Pd[x,y]=new double[5]{0.0,0.25,0.25,0.25,0.25};// 0:pause,1:Left,2:Right,3:Down,4:Up
			
			if(x==0 || (x==posB%3+1 && y==posB/3  ) ){Pd[x,y][0]+=0.25;Pd[x,y][1]-=0.25;}
			if(x==2 || (x==posB%3-1 && y==posB/3  ) ){Pd[x,y][0]+=0.25;Pd[x,y][2]-=0.25;}
			if(y==0 || (x==posB%3   && y==posB/3+1) ){Pd[x,y][0]+=0.25;Pd[x,y][4]-=0.25;}
			if(y==2 || (x==posB%3   && y==posB/3-1) ){Pd[x,y][0]+=0.25;Pd[x,y][3]-=0.25;}
			
		}
		
		for(int j=1;j<=d;j++){
			for(int k=0;k<9;k++){
				int xx=k%3;
				int yy=k/3;
				P[xx,yy][j] =P[xx,yy][j-1]*Pd[xx,yy][0];
				if(xx+1<=2)P[xx,yy][j]+=P[xx+1,yy][j-1]*Pd[xx+1,yy][1];
				if(xx-1>=0)P[xx,yy][j]+=P[xx-1,yy][j-1]*Pd[xx-1,yy][2];
				if(yy-1>=0)P[xx,yy][j]+=P[xx,yy-1][j-1]*Pd[xx,yy-1][3];
				if(yy+1<=2)P[xx,yy][j]+=P[xx,yy+1][j-1]*Pd[xx,yy+1][4];
			}
		}
		
		ans=P[posT%3,posT/3][d];
	
	}
}