private static HashSet<Coordinate> GetAdjacents( int distance )
{
if ( distance < 1 )
return new HashSet<Coordinate>();
lock ( _sync )
{
HashSet<Coordinate> adjacents;
if ( adjacentsCache.TryGetValue( distance, out adjacents ) )
return adjacents;
var temp1 = GetAdjacents( distance - 2 );
var temp2 = GetAdjacents( distance - 1 ).Except( temp1 );//得到外环
adjacents = new HashSet<Coordinate>( temp2.SelectMany( item => GetAdjacents( 1 ).Select( i => i + item ) ) );
adjacents.UnionWith( temp1 );
adjacents.ExceptWith( new[] { Origin } );
return adjacentsCache[distance] = adjacents;
}
}