For a similar problem, but may work also in this case, I have used AHRS (Attitude and Heading Reference System) using a Kalman filter.
Basically what you need is:
- An absolute positioning system, like signal strength from some wireless spots or similar; this has not to be very accurate, but gives the reference for the rest of the system;
- An accurate way to measure movements, like an IMU (Inertial Measurement Unit), with accelerometers, gyroscopes and magnetometers; this will give you a good estimation of the movement, and at least the accelerometers are provided by most of the smartphones.
With Kalman filter, you can use the first block to make a prediction of the position, and then the second to apply the movement to that prediction. This allows you to relate more measurements of the absolute position and have the convergence of the solution to a very accurate result.
Note that if you have a good starting spot (e.g. a checkpoint with - say - an NFC tag) the precision can be improved a lot.
You may also try with particle filters, where movement is used in combination with measurements in a similar way, to obtain the convergence of the position to an unique spot.