You should look at this thread, at the very least:

http://www.bay12forums.com/smf/index.php?topic=43265.0

and look up the A* and manhattan systems to understand their methods.

If he's just using A* with manhattan, regardless of programming optimization, how hard is it to just change the heuristic function, since manhattan weighting can be massively improved with a tie breaker, I have done a project during one of my AI courses which pitted various algorithms against each other on a 2D maze (25x25), these are the results (# of nodes searched to find path):

| End in a Room, 1 entrance, close. | Opposite Side of Map, multiple paths. | Opposite Corners of Map, multiple paths. |

Depth-First (not optimal) | 78 | 31 | 81 |

Breath-First | 376 | 250 | 488 |

A* (Euclidian) | 163 | 94 | 380 |

A* (Manhattan) | 77 | 81 | 340 |

A* (Vector) | 48 | 72 | 117 |

The Manhattan weighting is |x1-x2|+|y1-y2|, in 3D it should be |x1-x2|+|y1-y2|+|z2-z1|.

The vector weighting adds onto Manhattan using the cross product, and modifies the values to be less than 1, thereby allowing 2 nodes of value x to be differentiated from so say 2.1 and 2.2 rather than just 2 & 2 forcing both to be expanded.

The formula in 2D is (the 2 vectors are start-end, and node-end): (0 is start location, 2 = end location, 1 is current location/node)

dx1 = x1-x2

dx2 = x0-x2

dy1 = y1-y2

dy2 = y0-y2

CrossProduct = |dx1*dy2 - dx2*dy1|

For my application this was multiplied by 0.001 to ensure this value was never > than 1 but this could be modified upon map creation by taking the max possible cross product +1 as a divider, however in 3D space the cross product is not scalar but another vector, so I'm not entirely sure how to parse that into something meaningful, perhaps a smaller magnitude of a vector, I'm an engineer I'm sure a Mathy could figure something more useful out for 3D (the goal is the path that is more direct between start and end, so a smaller difference between the 2 vectors).

In 3D it would be:

dx1,dx2,dy1,dy2=same as above

dz1 = z1 - z2

dz2 = z0 - z2

CrossProduct = (dy1*dz2-dz1*dy2)i+(dz1*dx2-dx1*dz2)j+(dx1*dy2-dy1*dx2)k

Basically as long as the additional calculations take up less time than the number of nodes that are expanded (which each require further calculations) it is better, and in general mathematics are faster than node handling anyway on a computer.