рдкреИрдЯрд░реНрди рдореЗрдВ рдЧрддрд┐рд╢реАрд▓ рдкреНрд░реЛрдЧреНрд░рд╛рдорд┐рдВрдЧ

рдЗрд╕ рддрд░рд╣ рдХреА рдПрдХ рдЕрджреНрднреБрдд рд╕рдкреНрддрд╛рд╣рд╛рдВрдд рд╕рд╛рдЗрдЯ рд╣реИ рдЬреИрд╕реЗ рдХрд┐ codeeval.com ред рдЬрд┐рд╕ рдкрд░ рдЫреЛрдЯреА рдПрд▓реНрдЧреЛрд░рд┐рдердо рд╕рдорд╕реНрдпрд╛рдУрдВ рдХрд╛ рдПрдХ рдЕрдЪреНрдЫрд╛ рд╕рдВрдЧреНрд░рд╣ рд╣реИ рдФрд░ рдПрдХ рд╕реБрд╡рд┐рдзрд╛рдЬрдирдХ рд╕рддреНрдпрд╛рдкрди рдкреНрд░рдгрд╛рд▓реА рд╣реИ рдЬреЛ рдордиреЛрд░рдВрдЬрдХ рдкреНрд░реЛрдЧреНрд░рд╛рдорд░реЛрдВ рдХреЛ рдПрдХ рдордиреЛрд░рдВрдЬрдХ рд╢рд╛рдо рдмрд┐рддрд╛рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддреА рд╣реИред рдЖрдорддреМрд░ рдкрд░, рдПрдХ рдкрд░реАрдХреНрд╖рдг рдбреЗрдЯрд╛ рдлрд╝рд╛рдЗрд▓ рдХрд╛ рдЙрдкрдпреЛрдЧ рдЗрдирдкреБрдЯ рдХреЗ рд░реВрдк рдореЗрдВ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рд╣рд╛рд▓рд╛рдБрдХрд┐, рдореБрдЭреЗ рдПрдХ рд╕рдорд╕реНрдпрд╛ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдкрддрд╛ рдЪрд▓рд╛ рдЬрд┐рд╕рдореЗрдВ рдкрд░реАрдХреНрд╖рдг рдбреЗрдЯрд╛ рдкрд╣рд▓реЗ рд╕реЗ рдЬрд╛рдирд╛ рдЬрд╛рддрд╛ рд╣реИред рдПрдХ рдкреНрд░реЛрдЧреНрд░рд╛рдо рдбрд╛рдЙрдирд▓реЛрдб рдХрд░рдирд╛ рдЬреЛ рдХреЗрд╡рд▓ рд╕рд╣реА рдЙрддреНрддрд░ рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░реЗрдЧрд╛, рд╕реНрдкреЛрд░реНрдЯреА рдирд╣реАрдВ рд╣реИ, рд▓реЗрдХрд┐рди рд╕рдВрдХрд▓рди рдЪрд░рдг рдореЗрдВ рдЗрд╕рдХреА рдЧрдгрдирд╛ рдХрд░рдирд╛ рдмрд╕ рдЗрддрдирд╛ рд╣реА рд╣реИред

рдЗрд╕рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдХреНрдпрд╛ рдХрд╣рд╛ рдЕрдВрджрд░ рджреЗрдЦрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред

рдХрд╛рд░реНрдп рдЕрдкрдиреЗ рдЖрдк рдореЗрдВ рдЬрдЯрд┐рд▓ рдирд╣реАрдВ рд╣реИ рдФрд░ рдмрд╣реБрдд рд╕рд░рд▓рддрд╛ рд╕реЗ рдкреБрдирд░рд╛рд╡рд░реНрддреА рд╣реИред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдлрд╝рдВрдХреНрд╢рди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░:
int GetRouteCount(int map, int x, int y) { if ((x == -1) || (y == -1) || (x == 4) || (y == 4)) return 0; if ((x == 3) && ( y == 3)) return 1; if ( ( map & (1 << ( ( x << 2) +y) )) != 0 ) return 0; map |= (1 << ( (x << 2) +y)); return GetRouteCount(map, x-1, y) + GetRouteCount(map, x+1, y) + GetRouteCount(map, x, y-1) + GetRouteCount(map, x, y+1); } 

рдФрд░ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдкрд░рд┐рдгрд╛рдо рдорд┐рд▓ рд░рд╣рд╛ рд╣реИ:
 int result = GetRouteCount(1, 0, 1) << 1; 

рдЕрдм рдЖрдЗрдП рдЯреЗрдореНрдкреНрд▓реЗрдЯ рдореЗрдВ рд╕рдорд╛рди рдЧрдгрдирд╛ рдХрд░рдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд░реЗрдВред рдЯреЗрдореНрдкрд▓реЗрдЯ рдорд╛рдкрджрдВрдбреЛрдВ рдХреЗ рд░реВрдк рдореЗрдВ, рд╣рдореЗрдВ рдЖрдВрджреЛрд▓рдиреЛрдВ рдХреЗ "рдорд╛рдирдЪрд┐рддреНрд░" рдФрд░ рд╡рд░реНрддрдорд╛рди рдмрд┐рдВрджреБ рдХреЗ рдирд┐рд░реНрджреЗрд╢рд╛рдВрдХ рдХреЛ рдкреНрд░рд╕рд╛рд░рд┐рдд рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред рдЪреВрдБрдХрд┐ рд╡рд┐рд╢реЗрд╖рдЬреНрдЮрддрд╛ рдХрд╛ рдЙрдкрдпреЛрдЧ рдЗрд╕рдХреЗ рдмрдЬрд╛рдп рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛, рдпрджрд┐ рдмрд┐рдВрджреБ рдХреА рдпрд╛рддреНрд░рд╛ рдХреЗ рд▓рд┐рдП рдЬрд╛рдБрдЪ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдЖрдкрдХреЛ рдПрдХ рдЕрд▓рдЧ рдЯреЗрдореНрдкрд▓реЗрдЯ рдмрдирд╛рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ рдЬрд┐рд╕рдореЗрдВ рдЗрд╕ рдорд╛рдорд▓реЗ рдХреЗ рд▓рд┐рдП рд╡рд┐рд╢реЗрд╖рдЬреНрдЮрддрд╛ рд╣реЛрдЧреАред рдпрджрд┐ рдЖрдк рдореБрдЦреНрдп рдЯреЗрдореНрдкреНрд▓реЗрдЯ рдореЗрдВ рдПрдХ рдФрд░ рдкреИрд░рд╛рдореАрдЯрд░ рдЬреЛрдбрд╝рдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рдЖрдк рд╕рдВрдХрд▓рди рдЪрд░рдг рдореЗрдВ рдЕрд╕рдВрдЧрдд рд╕реНрдерд┐рддрд┐рдпреЛрдВ рдХрд╛ рд╕рд╛рдордирд╛ рдХрд░реЗрдВрдЧреЗред рдПрдХ рдпрд╛рддреНрд░рд╛ рдХреА рдЬрд╛рдБрдЪ рдЗрд╕ рддрд░рд╣ рд╣реЛрдЧреА:

 template< template<int, int, int> class _MR, int map, int x, int y, bool visited> struct GetCount { enum Result { value = _MR<(map | (1 << ( ( x << 2) +y ))), (x-1), y>::value + _MR<(map | (1 << ( ( x << 2) +y ))), (x+1), y>::value + _MR<(map | (1 << ( ( x << 2) +y ))), x, (y-1)>::value + _MR<(map | (1 << ( ( x << 2) +y ))), x, (y+1)>::value }; }; template< template<int, int, int> class _MR, int map, int x, int y> struct GetCount<_MR, map, x, y, true> { enum Result { value = 0 }; }; 

рдЕрдм рдПрдХ рдореВрд▓ рдЯреЗрдореНрдкреНрд▓реЗрдЯ рдмрдирд╛рдПрдВ рдЬреЛ рдирд┐рд░реНрджреЗрд╢рд╛рдВрдХ рдХреЗ рд╡рд┐рд╢реЗрд╖рдЬреНрдЮ рд╣реЛрдВрдЧреЗ рдЬреЛ рдЧреНрд░рд┐рдб рд╕реЗ рдЖрдЧреЗ рдЬрд╛рддреЗ рд╣реИрдВ рдФрд░ рд╕рддреНрдпрд╛рдкрд┐рдд рдХрд░рддреЗ рд╣реИрдВ рдХрд┐ рдЧрдВрддрд╡реНрдп рдкрд╣реБрдВрдЪ рдЧрдпрд╛ рд╣реИ:
 template <int map, int x, int y> struct MapRoute { enum Result { value = GetCount<MapRoute, map, x, y, ( (map & ( 1 << ( (x << 2) +y))) != 0 )>::value }; }; template<int map, int y> struct MapRoute<map, -1, y> { enum Result { value = 0 }; }; template<int map, int y> struct MapRoute<map, 4, y> { enum Result { value = 0 }; }; template<int map, int x> struct MapRoute<map, x, -1> { enum Result { value = 0 }; }; template<int map, int x> struct MapRoute<map, x, 4> { enum Result { value = 0 }; }; template<int map> struct MapRoute<map, 3, 3> { enum Result { value = 1 }; }; 

рдпрд╣реА рдХрд╛рд░рдг рд╣реИ рдХрд┐, рдкрд░рд┐рдгрд╛рдо рдкреНрд░рд╛рдкреНрдд рдХрд░рдирд╛ рд▓рдЧрднрдЧ рдЙрддрдирд╛ рд╣реА рдХрдард┐рди рд╣реИ рдЬрд┐рддрдирд╛ рдХрд┐ рд░рдирдЯрд╛рдЗрдо рдореЗрдВ рдЧрдгрдирд╛:
 int result = MapRoute<0, 0, 0>::value; 

рдЖрдк рд╕рднреА рдХреЛрдб рдФрд░ рдЗрд╕рдХреЗ рдирд┐рд╖реНрдкрд╛рджрди рдХреЗ рдкрд░рд┐рдгрд╛рдо рдХреЛ рд▓рд┐рдВрдХ рдкрд░ рдХреНрд▓рд┐рдХ рдХрд░рдХреЗ рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВред

Source: https://habr.com/ru/post/In208186/


All Articles