{"group":{"id":1,"name":"Community","lockable":false,"created_at":"2012-01-18T18:02:15.000Z","updated_at":"2026-04-16T00:12:35.000Z","description":"Problems submitted by members of the MATLAB Central community.","is_default":true,"created_by":161519,"badge_id":null,"featured":false,"trending":false,"solution_count_in_trending_period":0,"trending_last_calculated":"2026-04-16T00:00:00.000Z","image_id":null,"published":true,"community_created":false,"status_id":2,"is_default_group_for_player":false,"deleted_by":null,"deleted_at":null,"restored_by":null,"restored_at":null,"description_opc":null,"description_html":null,"published_at":null},"problems":[{"id":1978,"title":"Sokoban: Puzzle 10.45","description":"The \u003chttp://www.game-sokoban.com/index.php?mode=level\u0026lid=16138 Sokoban Site\u003e has many puzzles to solve.  This Challenge is to solve puzzle 10.45.  The link may place the Cody enthusiast at 10.55. \u003chttp://en.wikipedia.org/wiki/Sokoban wiki Sokoban reference\u003e. \r\n\r\nThe basic rules are to places the Blocks on the Pedestals. Blocks can only be pushed, never pulled. A connected Pair of blocks can not be moved along their long axis. A 2x2 square of blocks is immoveable. A Wall can not be moved.\r\n\r\nSokoban can not jump blocks or move diagonally.\r\n\r\nThe map will be double ringed by a Wall(1). Map definitions: Empty(0) Block(2) Pedestal(3) Sokoban(4) Block on Pedestal(5) Sokoban on Pedestal(7).  \r\n\r\nSokoban Movement is a numeric vector L(-nr) U(-1) R(nr) D(+1).\r\n\r\n*Input:* Map, [nr,nc] of  Sokoban characters [0,1,2,3,4,5,7]\r\n\r\n*Output:* Moves, Vector of [-1 +1 -nr +nr] values\r\n\r\n*Scoring:* Sum of Moves and Pushes\r\n\r\n*Examples:* \r\n\r\nMap\r\n\r\n  11111111\r\n  11111111 Moves=[5]  push right for a 5 row array\r\n  11042311\r\n  11111111\r\n  11111111\r\n\r\n*Test Suite Visualization:* A visualization option is provided.\r\n\r\n*Algorithms:* Recursive routines that check all possible pushes can solve small Sokoban puzzles. Routines that limit their depth can find minimal Push solutions at the cost of time. Identification of Locked conditions is important to avoid being stuck in recursion. Pairs of blocks on a wall or too many blocks on a wall are unsolveable conditions to avoid. \r\n","description_html":"\u003cp\u003eThe \u003ca href = \"http://www.game-sokoban.com/index.php?mode=level\u0026lid=16138\"\u003eSokoban Site\u003c/a\u003e has many puzzles to solve.  This Challenge is to solve puzzle 10.45.  The link may place the Cody enthusiast at 10.55. \u003ca href = \"http://en.wikipedia.org/wiki/Sokoban\"\u003ewiki Sokoban reference\u003c/a\u003e.\u003c/p\u003e\u003cp\u003eThe basic rules are to places the Blocks on the Pedestals. Blocks can only be pushed, never pulled. A connected Pair of blocks can not be moved along their long axis. A 2x2 square of blocks is immoveable. A Wall can not be moved.\u003c/p\u003e\u003cp\u003eSokoban can not jump blocks or move diagonally.\u003c/p\u003e\u003cp\u003eThe map will be double ringed by a Wall(1). Map definitions: Empty(0) Block(2) Pedestal(3) Sokoban(4) Block on Pedestal(5) Sokoban on Pedestal(7).\u003c/p\u003e\u003cp\u003eSokoban Movement is a numeric vector L(-nr) U(-1) R(nr) D(+1).\u003c/p\u003e\u003cp\u003e\u003cb\u003eInput:\u003c/b\u003e Map, [nr,nc] of  Sokoban characters [0,1,2,3,4,5,7]\u003c/p\u003e\u003cp\u003e\u003cb\u003eOutput:\u003c/b\u003e Moves, Vector of [-1 +1 -nr +nr] values\u003c/p\u003e\u003cp\u003e\u003cb\u003eScoring:\u003c/b\u003e Sum of Moves and Pushes\u003c/p\u003e\u003cp\u003e\u003cb\u003eExamples:\u003c/b\u003e\u003c/p\u003e\u003cp\u003eMap\u003c/p\u003e\u003cpre class=\"language-matlab\"\u003e11111111\r\n11111111 Moves=[5]  push right for a 5 row array\r\n11042311\r\n11111111\r\n11111111\r\n\u003c/pre\u003e\u003cp\u003e\u003cb\u003eTest Suite Visualization:\u003c/b\u003e A visualization option is provided.\u003c/p\u003e\u003cp\u003e\u003cb\u003eAlgorithms:\u003c/b\u003e Recursive routines that check all possible pushes can solve small Sokoban puzzles. Routines that limit their depth can find minimal Push solutions at the cost of time. Identification of Locked conditions is important to avoid being stuck in recursion. Pairs of blocks on a wall or too many blocks on a wall are unsolveable conditions to avoid.\u003c/p\u003e","function_template":"function moves=solve_Sokoban(m)\r\n% 0 Empty; 1 Wall; 2 Block; 3 Pedestal;\r\n% 4 Sokoban; 5 Block \u0026 Pedestal;6 Nothing; 7 Soko \u0026 Pedestal\r\n\r\n moves=[];\r\nend","test_suite":"assignin('caller','score',200);\r\n%%\r\nvisualize=0;\r\nif visualize\r\n figure(1); % Start\r\n map=[.5 .5 .5;0 0 0;.5 .5 .5;0 1 0;0 0 1;\r\n    1 0 0;1 1 0;0 0 0;1 0 1;.5 .5 .5];\r\n colormap(map);\r\n figure(2); % Move map\r\n% -1 0 1 2 3 4 5 6 7 8\r\n% -1 color limit, 8 color limit\r\n% 0 Empty; 1 Wall; 2 Block; 3 Pedestal;\r\n% 4 Sokoban; 5 Block \u0026 Pedestal;6 Nothing; 7 Soko \u0026 Pedestal\r\n colormap(map)\r\nend\r\n\r\n%Sokoban map http://www.game-sokoban.com/index.php?mode=level\u0026lid=16138 \r\n%Puzzle 45 \r\nsmap=[0 0 0 0 0 0;0 3 2 2 4 0;3 3 2 0 2 0;3 5 0 0 1 1];\r\n[nr,nc]=size(smap);\r\nm=ones(nr+4,nc+4);\r\nm(3:end-2,3:end-2)=smap;\r\n\r\nif visualize\r\n im=m;\r\n mend=size(map,1)-2;\r\n im(1)=-1;im(end)=mend;\r\n figure(1);imagesc(im)\r\n m\r\nend\r\n\r\ntic\r\nmoves=solve_Sokoban(m);\r\ntoc\r\n\r\n% Check Solution\r\n valid=1;\r\n ptr=find(m==4);\r\n pushes=0;\r\n if isempty(ptr),ptr=find(m==7);end\r\n for i=1:length(moves)\r\n  mv=moves(i);\r\n  mvptr=m(ptr+mv);\r\n  mvptr2=m(ptr+2*mv);\r\n  if mvptr==1 % Illegal run into wall\r\n   valid=0;\r\n   break;\r\n  end\r\n  if (mvptr2==5 || mvptr2==2 || mvptr2==1) \u0026\u0026 (mvptr==5 || mvptr==2) % Illegal double block push\r\n   valid=0;\r\n   break;\r\n  end\r\n  if mvptr==0 || mvptr==3\r\n   m(ptr)=m(ptr)-4;\r\n   m(ptr+mv)=m(ptr+mv)+4;\r\n   ptr=ptr+mv;\r\n  elseif mvptr==2 || mvptr==5\r\n   m(ptr)=m(ptr)-4;\r\n   m(ptr+2*mv)=m(ptr+2*mv)+2;\r\n   m(ptr+mv)=m(ptr+mv)-2+4;\r\n   ptr=ptr+mv;\r\n   pushes=pushes+1;\r\n  end\r\n end\r\n \r\n fprintf('Moves %i  Pushes %i\\n',length(moves),pushes)\r\n valid=valid \u0026\u0026  nnz(m==3)==0 \u0026\u0026 nnz(m==7)==0;\r\n assert(valid)\r\n\r\nif visualize \u0026\u0026 valid\r\n % display moves\r\n figure(2);imagesc(im)\r\n pause(0.2)\r\n ptr=find(im==4);\r\n if isempty(ptr),ptr=find(im==7);end\r\n for i=1:length(moves)\r\n  mv=moves(i);\r\n  mvptr=im(ptr+mv);\r\n  if mvptr==0 || mvptr==3\r\n   im(ptr)=im(ptr)-4;\r\n   im(ptr+mv)=im(ptr+mv)+4;\r\n   ptr=ptr+mv;\r\n  elseif mvptr==2 || mvptr==5\r\n   im(ptr)=im(ptr)-4;\r\n   im(ptr+2*mv)=im(ptr+2*mv)+2;\r\n   im(ptr+mv)=im(ptr+mv)-2+4;\r\n   ptr=ptr+mv;\r\n  end\r\n  \r\n  figure(2);imagesc(im)\r\n  pause(0.2)\r\n end\r\n \r\nend % vis and valid\r\n\r\n\r\nmovs=length(moves);\r\nassignin('caller','score',min(200,max(0,movs+pushes)));","published":true,"deleted":false,"likes_count":0,"comments_count":0,"created_by":3097,"edited_by":null,"edited_at":null,"deleted_by":null,"deleted_at":null,"solvers_count":10,"test_suite_updated_at":"2013-11-11T01:51:09.000Z","rescore_all_solutions":false,"group_id":1,"created_at":"2013-11-10T23:21:50.000Z","updated_at":"2025-12-03T12:16:08.000Z","published_at":"2013-11-11T01:51:09.000Z","restored_at":null,"restored_by":null,"spam":false,"simulink":false,"admin_reviewed":false,"description_opc":"{\"relationships\":[{\"relationshipType\":\"http://schemas.mathworks.com/matlab/code/2013/relationships/document\",\"targetMode\":\"\",\"relationshipId\":\"rId1\",\"target\":\"/matlab/document.xml\"},{\"relationshipType\":\"http://schemas.mathworks.com/matlab/code/2013/relationships/output\",\"targetMode\":\"\",\"relationshipId\":\"rId2\",\"target\":\"/matlab/output.xml\"}],\"parts\":[{\"partUri\":\"/matlab/document.xml\",\"relationship\":[],\"contentType\":\"application/vnd.mathworks.matlab.code.document+xml\",\"content\":\"\u003c?xml version=\\\"1.0\\\" encoding=\\\"UTF-8\\\"?\u003e\\n\u003cw:document xmlns:w=\\\"http://schemas.openxmlformats.org/wordprocessingml/2006/main\\\"\u003e\u003cw:body\u003e\u003cw:p\u003e\u003cw:pPr\u003e\u003cw:pStyle w:val=\\\"text\\\"/\u003e\u003c/w:pPr\u003e\u003cw:r\u003e\u003cw:t\u003eThe\u003c/w:t\u003e\u003c/w:r\u003e\u003cw:r\u003e\u003cw:t\u003e \u003c/w:t\u003e\u003c/w:r\u003e\u003cw:hyperlink w:docLocation=\\\"http://www.game-sokoban.com/index.php?mode=level\u0026amp;lid=16138\\\"\u003e\u003cw:r\u003e\u003cw:t\u003eSokoban Site\u003c/w:t\u003e\u003c/w:r\u003e\u003c/w:hyperlink\u003e\u003cw:r\u003e\u003cw:t\u003e has many puzzles to solve. This Challenge is to solve puzzle 10.45. The link may place the Cody enthusiast at 10.55.\u003c/w:t\u003e\u003c/w:r\u003e\u003cw:r\u003e\u003cw:t\u003e \u003c/w:t\u003e\u003c/w:r\u003e\u003cw:hyperlink w:docLocation=\\\"http://en.wikipedia.org/wiki/Sokoban\\\"\u003e\u003cw:r\u003e\u003cw:t\u003ewiki Sokoban reference\u003c/w:t\u003e\u003c/w:r\u003e\u003c/w:hyperlink\u003e\u003cw:r\u003e\u003cw:t\u003e.\u003c/w:t\u003e\u003c/w:r\u003e\u003c/w:p\u003e\u003cw:p\u003e\u003cw:pPr\u003e\u003cw:pStyle w:val=\\\"text\\\"/\u003e\u003c/w:pPr\u003e\u003cw:r\u003e\u003cw:t\u003eThe basic rules are to places the Blocks on the Pedestals. Blocks can only be pushed, never pulled. A connected Pair of blocks can not be moved along their long axis. A 2x2 square of blocks is immoveable. A Wall can not be moved.\u003c/w:t\u003e\u003c/w:r\u003e\u003c/w:p\u003e\u003cw:p\u003e\u003cw:pPr\u003e\u003cw:pStyle w:val=\\\"text\\\"/\u003e\u003c/w:pPr\u003e\u003cw:r\u003e\u003cw:t\u003eSokoban can not jump blocks or move diagonally.\u003c/w:t\u003e\u003c/w:r\u003e\u003c/w:p\u003e\u003cw:p\u003e\u003cw:pPr\u003e\u003cw:pStyle w:val=\\\"text\\\"/\u003e\u003c/w:pPr\u003e\u003cw:r\u003e\u003cw:t\u003eThe map will be double ringed by a Wall(1). Map definitions: Empty(0) Block(2) Pedestal(3) Sokoban(4) Block on Pedestal(5) Sokoban on Pedestal(7).\u003c/w:t\u003e\u003c/w:r\u003e\u003c/w:p\u003e\u003cw:p\u003e\u003cw:pPr\u003e\u003cw:pStyle w:val=\\\"text\\\"/\u003e\u003c/w:pPr\u003e\u003cw:r\u003e\u003cw:t\u003eSokoban Movement is a numeric vector L(-nr) U(-1) R(nr) D(+1).\u003c/w:t\u003e\u003c/w:r\u003e\u003c/w:p\u003e\u003cw:p\u003e\u003cw:pPr\u003e\u003cw:pStyle w:val=\\\"text\\\"/\u003e\u003c/w:pPr\u003e\u003cw:r\u003e\u003cw:rPr\u003e\u003cw:b/\u003e\u003c/w:rPr\u003e\u003cw:t\u003eInput:\u003c/w:t\u003e\u003c/w:r\u003e\u003cw:r\u003e\u003cw:t\u003e Map, [nr,nc] of Sokoban characters [0,1,2,3,4,5,7]\u003c/w:t\u003e\u003c/w:r\u003e\u003c/w:p\u003e\u003cw:p\u003e\u003cw:pPr\u003e\u003cw:pStyle w:val=\\\"text\\\"/\u003e\u003c/w:pPr\u003e\u003cw:r\u003e\u003cw:rPr\u003e\u003cw:b/\u003e\u003c/w:rPr\u003e\u003cw:t\u003eOutput:\u003c/w:t\u003e\u003c/w:r\u003e\u003cw:r\u003e\u003cw:t\u003e Moves, Vector of [-1 +1 -nr +nr] values\u003c/w:t\u003e\u003c/w:r\u003e\u003c/w:p\u003e\u003cw:p\u003e\u003cw:pPr\u003e\u003cw:pStyle w:val=\\\"text\\\"/\u003e\u003c/w:pPr\u003e\u003cw:r\u003e\u003cw:rPr\u003e\u003cw:b/\u003e\u003c/w:rPr\u003e\u003cw:t\u003eScoring:\u003c/w:t\u003e\u003c/w:r\u003e\u003cw:r\u003e\u003cw:t\u003e Sum of Moves and Pushes\u003c/w:t\u003e\u003c/w:r\u003e\u003c/w:p\u003e\u003cw:p\u003e\u003cw:pPr\u003e\u003cw:pStyle w:val=\\\"text\\\"/\u003e\u003c/w:pPr\u003e\u003cw:r\u003e\u003cw:rPr\u003e\u003cw:b/\u003e\u003c/w:rPr\u003e\u003cw:t\u003eExamples:\u003c/w:t\u003e\u003c/w:r\u003e\u003c/w:p\u003e\u003cw:p\u003e\u003cw:pPr\u003e\u003cw:pStyle w:val=\\\"text\\\"/\u003e\u003c/w:pPr\u003e\u003cw:r\u003e\u003cw:t\u003eMap\u003c/w:t\u003e\u003c/w:r\u003e\u003c/w:p\u003e\u003cw:p\u003e\u003cw:pPr\u003e\u003cw:pStyle w:val=\\\"code\\\"/\u003e\u003c/w:pPr\u003e\u003cw:r\u003e\u003cw:t\u003e\u003c![CDATA[11111111\\n11111111 Moves=[5]  push right for a 5 row array\\n11042311\\n11111111\\n11111111]]\u003e\u003c/w:t\u003e\u003c/w:r\u003e\u003c/w:p\u003e\u003cw:p\u003e\u003cw:pPr\u003e\u003cw:pStyle w:val=\\\"text\\\"/\u003e\u003c/w:pPr\u003e\u003cw:r\u003e\u003cw:rPr\u003e\u003cw:b/\u003e\u003c/w:rPr\u003e\u003cw:t\u003eTest Suite Visualization:\u003c/w:t\u003e\u003c/w:r\u003e\u003cw:r\u003e\u003cw:t\u003e A visualization option is provided.\u003c/w:t\u003e\u003c/w:r\u003e\u003c/w:p\u003e\u003cw:p\u003e\u003cw:pPr\u003e\u003cw:pStyle w:val=\\\"text\\\"/\u003e\u003c/w:pPr\u003e\u003cw:r\u003e\u003cw:rPr\u003e\u003cw:b/\u003e\u003c/w:rPr\u003e\u003cw:t\u003eAlgorithms:\u003c/w:t\u003e\u003c/w:r\u003e\u003cw:r\u003e\u003cw:t\u003e Recursive routines that check all possible pushes can solve small Sokoban puzzles. Routines that limit their depth can find minimal Push solutions at the cost of time. Identification of Locked conditions is important to avoid being stuck in recursion. Pairs of blocks on a wall or too many blocks on a wall are unsolveable conditions to avoid.\u003c/w:t\u003e\u003c/w:r\u003e\u003c/w:p\u003e\u003c/w:body\u003e\u003c/w:document\u003e\"},{\"partUri\":\"/matlab/output.xml\",\"contentType\":\"text/xml\",\"content\":\"\u003c?xml version=\\\"1.0\\\" encoding=\\\"UTF-8\\\" standalone=\\\"no\\\" ?\u003e\u003cembeddedOutputs\u003e\u003cmetaData\u003e\u003cevaluationState\u003emanual\u003c/evaluationState\u003e\u003clayoutState\u003ecode\u003c/layoutState\u003e\u003coutputStatus\u003eready\u003c/outputStatus\u003e\u003c/metaData\u003e\u003coutputArray type=\\\"array\\\"/\u003e\u003cregionArray type=\\\"array\\\"/\u003e\u003c/embeddedOutputs\u003e\"}]}"}],"problem_search":{"errors":[],"problems":[{"id":1978,"title":"Sokoban: Puzzle 10.45","description":"The \u003chttp://www.game-sokoban.com/index.php?mode=level\u0026lid=16138 Sokoban Site\u003e has many puzzles to solve.  This Challenge is to solve puzzle 10.45.  The link may place the Cody enthusiast at 10.55. \u003chttp://en.wikipedia.org/wiki/Sokoban wiki Sokoban reference\u003e. \r\n\r\nThe basic rules are to places the Blocks on the Pedestals. Blocks can only be pushed, never pulled. A connected Pair of blocks can not be moved along their long axis. A 2x2 square of blocks is immoveable. A Wall can not be moved.\r\n\r\nSokoban can not jump blocks or move diagonally.\r\n\r\nThe map will be double ringed by a Wall(1). Map definitions: Empty(0) Block(2) Pedestal(3) Sokoban(4) Block on Pedestal(5) Sokoban on Pedestal(7).  \r\n\r\nSokoban Movement is a numeric vector L(-nr) U(-1) R(nr) D(+1).\r\n\r\n*Input:* Map, [nr,nc] of  Sokoban characters [0,1,2,3,4,5,7]\r\n\r\n*Output:* Moves, Vector of [-1 +1 -nr +nr] values\r\n\r\n*Scoring:* Sum of Moves and Pushes\r\n\r\n*Examples:* \r\n\r\nMap\r\n\r\n  11111111\r\n  11111111 Moves=[5]  push right for a 5 row array\r\n  11042311\r\n  11111111\r\n  11111111\r\n\r\n*Test Suite Visualization:* A visualization option is provided.\r\n\r\n*Algorithms:* Recursive routines that check all possible pushes can solve small Sokoban puzzles. Routines that limit their depth can find minimal Push solutions at the cost of time. Identification of Locked conditions is important to avoid being stuck in recursion. Pairs of blocks on a wall or too many blocks on a wall are unsolveable conditions to avoid. \r\n","description_html":"\u003cp\u003eThe \u003ca href = \"http://www.game-sokoban.com/index.php?mode=level\u0026lid=16138\"\u003eSokoban Site\u003c/a\u003e has many puzzles to solve.  This Challenge is to solve puzzle 10.45.  The link may place the Cody enthusiast at 10.55. \u003ca href = \"http://en.wikipedia.org/wiki/Sokoban\"\u003ewiki Sokoban reference\u003c/a\u003e.\u003c/p\u003e\u003cp\u003eThe basic rules are to places the Blocks on the Pedestals. Blocks can only be pushed, never pulled. A connected Pair of blocks can not be moved along their long axis. A 2x2 square of blocks is immoveable. A Wall can not be moved.\u003c/p\u003e\u003cp\u003eSokoban can not jump blocks or move diagonally.\u003c/p\u003e\u003cp\u003eThe map will be double ringed by a Wall(1). Map definitions: Empty(0) Block(2) Pedestal(3) Sokoban(4) Block on Pedestal(5) Sokoban on Pedestal(7).\u003c/p\u003e\u003cp\u003eSokoban Movement is a numeric vector L(-nr) U(-1) R(nr) D(+1).\u003c/p\u003e\u003cp\u003e\u003cb\u003eInput:\u003c/b\u003e Map, [nr,nc] of  Sokoban characters [0,1,2,3,4,5,7]\u003c/p\u003e\u003cp\u003e\u003cb\u003eOutput:\u003c/b\u003e Moves, Vector of [-1 +1 -nr +nr] values\u003c/p\u003e\u003cp\u003e\u003cb\u003eScoring:\u003c/b\u003e Sum of Moves and Pushes\u003c/p\u003e\u003cp\u003e\u003cb\u003eExamples:\u003c/b\u003e\u003c/p\u003e\u003cp\u003eMap\u003c/p\u003e\u003cpre class=\"language-matlab\"\u003e11111111\r\n11111111 Moves=[5]  push right for a 5 row array\r\n11042311\r\n11111111\r\n11111111\r\n\u003c/pre\u003e\u003cp\u003e\u003cb\u003eTest Suite Visualization:\u003c/b\u003e A visualization option is provided.\u003c/p\u003e\u003cp\u003e\u003cb\u003eAlgorithms:\u003c/b\u003e Recursive routines that check all possible pushes can solve small Sokoban puzzles. Routines that limit their depth can find minimal Push solutions at the cost of time. Identification of Locked conditions is important to avoid being stuck in recursion. Pairs of blocks on a wall or too many blocks on a wall are unsolveable conditions to avoid.\u003c/p\u003e","function_template":"function moves=solve_Sokoban(m)\r\n% 0 Empty; 1 Wall; 2 Block; 3 Pedestal;\r\n% 4 Sokoban; 5 Block \u0026 Pedestal;6 Nothing; 7 Soko \u0026 Pedestal\r\n\r\n moves=[];\r\nend","test_suite":"assignin('caller','score',200);\r\n%%\r\nvisualize=0;\r\nif visualize\r\n figure(1); % Start\r\n map=[.5 .5 .5;0 0 0;.5 .5 .5;0 1 0;0 0 1;\r\n    1 0 0;1 1 0;0 0 0;1 0 1;.5 .5 .5];\r\n colormap(map);\r\n figure(2); % Move map\r\n% -1 0 1 2 3 4 5 6 7 8\r\n% -1 color limit, 8 color limit\r\n% 0 Empty; 1 Wall; 2 Block; 3 Pedestal;\r\n% 4 Sokoban; 5 Block \u0026 Pedestal;6 Nothing; 7 Soko \u0026 Pedestal\r\n colormap(map)\r\nend\r\n\r\n%Sokoban map http://www.game-sokoban.com/index.php?mode=level\u0026lid=16138 \r\n%Puzzle 45 \r\nsmap=[0 0 0 0 0 0;0 3 2 2 4 0;3 3 2 0 2 0;3 5 0 0 1 1];\r\n[nr,nc]=size(smap);\r\nm=ones(nr+4,nc+4);\r\nm(3:end-2,3:end-2)=smap;\r\n\r\nif visualize\r\n im=m;\r\n mend=size(map,1)-2;\r\n im(1)=-1;im(end)=mend;\r\n figure(1);imagesc(im)\r\n m\r\nend\r\n\r\ntic\r\nmoves=solve_Sokoban(m);\r\ntoc\r\n\r\n% Check Solution\r\n valid=1;\r\n ptr=find(m==4);\r\n pushes=0;\r\n if isempty(ptr),ptr=find(m==7);end\r\n for i=1:length(moves)\r\n  mv=moves(i);\r\n  mvptr=m(ptr+mv);\r\n  mvptr2=m(ptr+2*mv);\r\n  if mvptr==1 % Illegal run into wall\r\n   valid=0;\r\n   break;\r\n  end\r\n  if (mvptr2==5 || mvptr2==2 || mvptr2==1) \u0026\u0026 (mvptr==5 || mvptr==2) % Illegal double block push\r\n   valid=0;\r\n   break;\r\n  end\r\n  if mvptr==0 || mvptr==3\r\n   m(ptr)=m(ptr)-4;\r\n   m(ptr+mv)=m(ptr+mv)+4;\r\n   ptr=ptr+mv;\r\n  elseif mvptr==2 || mvptr==5\r\n   m(ptr)=m(ptr)-4;\r\n   m(ptr+2*mv)=m(ptr+2*mv)+2;\r\n   m(ptr+mv)=m(ptr+mv)-2+4;\r\n   ptr=ptr+mv;\r\n   pushes=pushes+1;\r\n  end\r\n end\r\n \r\n fprintf('Moves %i  Pushes %i\\n',length(moves),pushes)\r\n valid=valid \u0026\u0026  nnz(m==3)==0 \u0026\u0026 nnz(m==7)==0;\r\n assert(valid)\r\n\r\nif visualize \u0026\u0026 valid\r\n % display moves\r\n figure(2);imagesc(im)\r\n pause(0.2)\r\n ptr=find(im==4);\r\n if isempty(ptr),ptr=find(im==7);end\r\n for i=1:length(moves)\r\n  mv=moves(i);\r\n  mvptr=im(ptr+mv);\r\n  if mvptr==0 || mvptr==3\r\n   im(ptr)=im(ptr)-4;\r\n   im(ptr+mv)=im(ptr+mv)+4;\r\n   ptr=ptr+mv;\r\n  elseif mvptr==2 || mvptr==5\r\n   im(ptr)=im(ptr)-4;\r\n   im(ptr+2*mv)=im(ptr+2*mv)+2;\r\n   im(ptr+mv)=im(ptr+mv)-2+4;\r\n   ptr=ptr+mv;\r\n  end\r\n  \r\n  figure(2);imagesc(im)\r\n  pause(0.2)\r\n end\r\n \r\nend % vis and valid\r\n\r\n\r\nmovs=length(moves);\r\nassignin('caller','score',min(200,max(0,movs+pushes)));","published":true,"deleted":false,"likes_count":0,"comments_count":0,"created_by":3097,"edited_by":null,"edited_at":null,"deleted_by":null,"deleted_at":null,"solvers_count":10,"test_suite_updated_at":"2013-11-11T01:51:09.000Z","rescore_all_solutions":false,"group_id":1,"created_at":"2013-11-10T23:21:50.000Z","updated_at":"2025-12-03T12:16:08.000Z","published_at":"2013-11-11T01:51:09.000Z","restored_at":null,"restored_by":null,"spam":false,"simulink":false,"admin_reviewed":false,"description_opc":"{\"relationships\":[{\"relationshipType\":\"http://schemas.mathworks.com/matlab/code/2013/relationships/document\",\"targetMode\":\"\",\"relationshipId\":\"rId1\",\"target\":\"/matlab/document.xml\"},{\"relationshipType\":\"http://schemas.mathworks.com/matlab/code/2013/relationships/output\",\"targetMode\":\"\",\"relationshipId\":\"rId2\",\"target\":\"/matlab/output.xml\"}],\"parts\":[{\"partUri\":\"/matlab/document.xml\",\"relationship\":[],\"contentType\":\"application/vnd.mathworks.matlab.code.document+xml\",\"content\":\"\u003c?xml version=\\\"1.0\\\" encoding=\\\"UTF-8\\\"?\u003e\\n\u003cw:document xmlns:w=\\\"http://schemas.openxmlformats.org/wordprocessingml/2006/main\\\"\u003e\u003cw:body\u003e\u003cw:p\u003e\u003cw:pPr\u003e\u003cw:pStyle w:val=\\\"text\\\"/\u003e\u003c/w:pPr\u003e\u003cw:r\u003e\u003cw:t\u003eThe\u003c/w:t\u003e\u003c/w:r\u003e\u003cw:r\u003e\u003cw:t\u003e \u003c/w:t\u003e\u003c/w:r\u003e\u003cw:hyperlink w:docLocation=\\\"http://www.game-sokoban.com/index.php?mode=level\u0026amp;lid=16138\\\"\u003e\u003cw:r\u003e\u003cw:t\u003eSokoban Site\u003c/w:t\u003e\u003c/w:r\u003e\u003c/w:hyperlink\u003e\u003cw:r\u003e\u003cw:t\u003e has many puzzles to solve. This Challenge is to solve puzzle 10.45. The link may place the Cody enthusiast at 10.55.\u003c/w:t\u003e\u003c/w:r\u003e\u003cw:r\u003e\u003cw:t\u003e \u003c/w:t\u003e\u003c/w:r\u003e\u003cw:hyperlink w:docLocation=\\\"http://en.wikipedia.org/wiki/Sokoban\\\"\u003e\u003cw:r\u003e\u003cw:t\u003ewiki Sokoban reference\u003c/w:t\u003e\u003c/w:r\u003e\u003c/w:hyperlink\u003e\u003cw:r\u003e\u003cw:t\u003e.\u003c/w:t\u003e\u003c/w:r\u003e\u003c/w:p\u003e\u003cw:p\u003e\u003cw:pPr\u003e\u003cw:pStyle w:val=\\\"text\\\"/\u003e\u003c/w:pPr\u003e\u003cw:r\u003e\u003cw:t\u003eThe basic rules are to places the Blocks on the Pedestals. Blocks can only be pushed, never pulled. A connected Pair of blocks can not be moved along their long axis. A 2x2 square of blocks is immoveable. A Wall can not be moved.\u003c/w:t\u003e\u003c/w:r\u003e\u003c/w:p\u003e\u003cw:p\u003e\u003cw:pPr\u003e\u003cw:pStyle w:val=\\\"text\\\"/\u003e\u003c/w:pPr\u003e\u003cw:r\u003e\u003cw:t\u003eSokoban can not jump blocks or move diagonally.\u003c/w:t\u003e\u003c/w:r\u003e\u003c/w:p\u003e\u003cw:p\u003e\u003cw:pPr\u003e\u003cw:pStyle w:val=\\\"text\\\"/\u003e\u003c/w:pPr\u003e\u003cw:r\u003e\u003cw:t\u003eThe map will be double ringed by a Wall(1). Map definitions: Empty(0) Block(2) Pedestal(3) Sokoban(4) Block on Pedestal(5) Sokoban on Pedestal(7).\u003c/w:t\u003e\u003c/w:r\u003e\u003c/w:p\u003e\u003cw:p\u003e\u003cw:pPr\u003e\u003cw:pStyle w:val=\\\"text\\\"/\u003e\u003c/w:pPr\u003e\u003cw:r\u003e\u003cw:t\u003eSokoban Movement is a numeric vector L(-nr) U(-1) R(nr) D(+1).\u003c/w:t\u003e\u003c/w:r\u003e\u003c/w:p\u003e\u003cw:p\u003e\u003cw:pPr\u003e\u003cw:pStyle w:val=\\\"text\\\"/\u003e\u003c/w:pPr\u003e\u003cw:r\u003e\u003cw:rPr\u003e\u003cw:b/\u003e\u003c/w:rPr\u003e\u003cw:t\u003eInput:\u003c/w:t\u003e\u003c/w:r\u003e\u003cw:r\u003e\u003cw:t\u003e Map, [nr,nc] of Sokoban characters [0,1,2,3,4,5,7]\u003c/w:t\u003e\u003c/w:r\u003e\u003c/w:p\u003e\u003cw:p\u003e\u003cw:pPr\u003e\u003cw:pStyle w:val=\\\"text\\\"/\u003e\u003c/w:pPr\u003e\u003cw:r\u003e\u003cw:rPr\u003e\u003cw:b/\u003e\u003c/w:rPr\u003e\u003cw:t\u003eOutput:\u003c/w:t\u003e\u003c/w:r\u003e\u003cw:r\u003e\u003cw:t\u003e Moves, Vector of [-1 +1 -nr +nr] values\u003c/w:t\u003e\u003c/w:r\u003e\u003c/w:p\u003e\u003cw:p\u003e\u003cw:pPr\u003e\u003cw:pStyle w:val=\\\"text\\\"/\u003e\u003c/w:pPr\u003e\u003cw:r\u003e\u003cw:rPr\u003e\u003cw:b/\u003e\u003c/w:rPr\u003e\u003cw:t\u003eScoring:\u003c/w:t\u003e\u003c/w:r\u003e\u003cw:r\u003e\u003cw:t\u003e Sum of Moves and Pushes\u003c/w:t\u003e\u003c/w:r\u003e\u003c/w:p\u003e\u003cw:p\u003e\u003cw:pPr\u003e\u003cw:pStyle w:val=\\\"text\\\"/\u003e\u003c/w:pPr\u003e\u003cw:r\u003e\u003cw:rPr\u003e\u003cw:b/\u003e\u003c/w:rPr\u003e\u003cw:t\u003eExamples:\u003c/w:t\u003e\u003c/w:r\u003e\u003c/w:p\u003e\u003cw:p\u003e\u003cw:pPr\u003e\u003cw:pStyle w:val=\\\"text\\\"/\u003e\u003c/w:pPr\u003e\u003cw:r\u003e\u003cw:t\u003eMap\u003c/w:t\u003e\u003c/w:r\u003e\u003c/w:p\u003e\u003cw:p\u003e\u003cw:pPr\u003e\u003cw:pStyle w:val=\\\"code\\\"/\u003e\u003c/w:pPr\u003e\u003cw:r\u003e\u003cw:t\u003e\u003c![CDATA[11111111\\n11111111 Moves=[5]  push right for a 5 row array\\n11042311\\n11111111\\n11111111]]\u003e\u003c/w:t\u003e\u003c/w:r\u003e\u003c/w:p\u003e\u003cw:p\u003e\u003cw:pPr\u003e\u003cw:pStyle w:val=\\\"text\\\"/\u003e\u003c/w:pPr\u003e\u003cw:r\u003e\u003cw:rPr\u003e\u003cw:b/\u003e\u003c/w:rPr\u003e\u003cw:t\u003eTest Suite Visualization:\u003c/w:t\u003e\u003c/w:r\u003e\u003cw:r\u003e\u003cw:t\u003e A visualization option is provided.\u003c/w:t\u003e\u003c/w:r\u003e\u003c/w:p\u003e\u003cw:p\u003e\u003cw:pPr\u003e\u003cw:pStyle w:val=\\\"text\\\"/\u003e\u003c/w:pPr\u003e\u003cw:r\u003e\u003cw:rPr\u003e\u003cw:b/\u003e\u003c/w:rPr\u003e\u003cw:t\u003eAlgorithms:\u003c/w:t\u003e\u003c/w:r\u003e\u003cw:r\u003e\u003cw:t\u003e Recursive routines that check all possible pushes can solve small Sokoban puzzles. Routines that limit their depth can find minimal Push solutions at the cost of time. Identification of Locked conditions is important to avoid being stuck in recursion. Pairs of blocks on a wall or too many blocks on a wall are unsolveable conditions to avoid.\u003c/w:t\u003e\u003c/w:r\u003e\u003c/w:p\u003e\u003c/w:body\u003e\u003c/w:document\u003e\"},{\"partUri\":\"/matlab/output.xml\",\"contentType\":\"text/xml\",\"content\":\"\u003c?xml version=\\\"1.0\\\" encoding=\\\"UTF-8\\\" standalone=\\\"no\\\" ?\u003e\u003cembeddedOutputs\u003e\u003cmetaData\u003e\u003cevaluationState\u003emanual\u003c/evaluationState\u003e\u003clayoutState\u003ecode\u003c/layoutState\u003e\u003coutputStatus\u003eready\u003c/outputStatus\u003e\u003c/metaData\u003e\u003coutputArray type=\\\"array\\\"/\u003e\u003cregionArray type=\\\"array\\\"/\u003e\u003c/embeddedOutputs\u003e\"}]}"}],"term":"tag:\"sokoban\"","current_player_id":null,"fields":[{"name":"page","type":"integer","callback":null,"default":1,"directive":null,"facet":null,"facet_method":"and","operator":null,"param":null,"static":null,"prepend":true},{"name":"per_page","type":"integer","callback":null,"default":50,"directive":null,"facet":null,"facet_method":"and","operator":null,"param":null,"static":null,"prepend":true},{"name":"sort","type":"string","callback":null,"default":null,"directive":null,"facet":null,"facet_method":"and","operator":null,"param":null,"static":null,"prepend":true},{"name":"body","type":"text","callback":null,"default":"*:*","directive":null,"facet":null,"facet_method":"and","operator":null,"param":"term","static":null,"prepend":false},{"name":"group","type":"string","callback":null,"default":null,"directive":"group","facet":true,"facet_method":"and","operator":null,"param":"term","static":null,"prepend":true},{"name":"difficulty_rating_bin","type":"string","callback":null,"default":null,"directive":"difficulty_rating_bin","facet":true,"facet_method":"and","operator":null,"param":"term","static":null,"prepend":true},{"name":"id","type":"integer","callback":null,"default":null,"directive":"id","facet":null,"facet_method":"and","operator":null,"param":"term","static":null,"prepend":true},{"name":"tag","type":"string","callback":null,"default":null,"directive":"tag","facet":null,"facet_method":"and","operator":null,"param":"term","static":null,"prepend":true},{"name":"product","type":"string","callback":null,"default":null,"directive":"product","facet":null,"facet_method":"and","operator":null,"param":"term","static":null,"prepend":true},{"name":"created_at","type":"timeframe","callback":{},"default":null,"directive":"created_at","facet":null,"facet_method":"and","operator":null,"param":"term","static":null,"prepend":true},{"name":"profile_id","type":"integer","callback":null,"default":null,"directive":"author_id","facet":null,"facet_method":"and","operator":null,"param":"term","static":null,"prepend":true},{"name":"created_by","type":"string","callback":null,"default":null,"directive":"author","facet":null,"facet_method":"and","operator":null,"param":"term","static":null,"prepend":true},{"name":"player_id","type":"integer","callback":null,"default":null,"directive":"solver_id","facet":null,"facet_method":"and","operator":null,"param":"term","static":null,"prepend":true},{"name":"player","type":"string","callback":null,"default":null,"directive":"solver","facet":null,"facet_method":"and","operator":null,"param":"term","static":null,"prepend":true},{"name":"solvers_count","type":"integer","callback":null,"default":null,"directive":"solvers_count","facet":null,"facet_method":"and","operator":null,"param":"term","static":null,"prepend":true},{"name":"comments_count","type":"integer","callback":null,"default":null,"directive":"comments_count","facet":null,"facet_method":"and","operator":null,"param":"term","static":null,"prepend":true},{"name":"likes_count","type":"integer","callback":null,"default":null,"directive":"likes_count","facet":null,"facet_method":"and","operator":null,"param":"term","static":null,"prepend":true},{"name":"leader_id","type":"integer","callback":null,"default":null,"directive":"leader_id","facet":null,"facet_method":"and","operator":null,"param":"term","static":null,"prepend":true},{"name":"leading_solution","type":"integer","callback":null,"default":null,"directive":"leading_solution","facet":null,"facet_method":"and","operator":null,"param":"term","static":null,"prepend":true}],"filters":[{"name":"asset_type","type":"string","callback":null,"default":null,"directive":null,"facet":null,"facet_method":"and","operator":null,"param":null,"static":"\"cody:problem\"","prepend":true},{"name":"profile_id","type":"integer","callback":{},"default":null,"directive":null,"facet":null,"facet_method":"and","operator":null,"param":"author_id","static":null,"prepend":true}],"query":{"params":{"per_page":50,"term":"tag:\"sokoban\"","current_player":null,"sort":"map(difficulty_value,0,0,999) asc"},"parser":"MathWorks::Search::Solr::QueryParser","directives":{"term":{"directives":{"tag":[["tag:\"sokoban\"","","\"","sokoban","\""]]}}},"facets":{"#\u003cMathWorks::Search::Field:0x00007f23704fdc20\u003e":null,"#\u003cMathWorks::Search::Field:0x00007f23704fdb80\u003e":null},"filters":{"#\u003cMathWorks::Search::Field:0x00007f23704fd220\u003e":"\"cody:problem\""},"fields":{"#\u003cMathWorks::Search::Field:0x00007f23704fdf40\u003e":1,"#\u003cMathWorks::Search::Field:0x00007f23704fdea0\u003e":50,"#\u003cMathWorks::Search::Field:0x00007f23704fdd60\u003e":"map(difficulty_value,0,0,999) asc","#\u003cMathWorks::Search::Field:0x00007f23704fdcc0\u003e":"tag:\"sokoban\""},"user_query":{"#\u003cMathWorks::Search::Field:0x00007f23704fdcc0\u003e":"tag:\"sokoban\""},"queried_facets":{}},"query_backend":{"connection":{"configuration":{"index_url":"http://index-op-v2/solr/","query_url":"http://search-op-v2/solr/","direct_access_index_urls":["http://index-op-v2/solr/"],"direct_access_query_urls":["http://search-op-v2/solr/"],"timeout":10,"vhost":"search","exchange":"search.topic","heartbeat":30,"pre_index_mode":false,"host":"rabbitmq-eks","port":5672,"username":"cody-search","password":"78X075ddcV44","virtual_host":"search","indexer":"amqp","http_logging":"true","core":"cody"},"query_connection":{"uri":"http://search-op-v2/solr/cody/","proxy":null,"connection":{"parallel_manager":null,"headers":{"User-Agent":"Faraday v1.0.1"},"params":{},"options":{"params_encoder":"Faraday::FlatParamsEncoder","proxy":null,"bind":null,"timeout":null,"open_timeout":null,"read_timeout":null,"write_timeout":null,"boundary":null,"oauth":null,"context":null,"on_data":null},"ssl":{"verify":true,"ca_file":null,"ca_path":null,"verify_mode":null,"cert_store":null,"client_cert":null,"client_key":null,"certificate":null,"private_key":null,"verify_depth":null,"version":null,"min_version":null,"max_version":null},"default_parallel_manager":null,"builder":{"adapter":{"name":"Faraday::Adapter::NetHttp","args":[],"block":null},"handlers":[{"name":"Faraday::Response::RaiseError","args":[],"block":null}],"app":{"app":{"ssl_cert_store":{"verify_callback":null,"error":null,"error_string":null,"chain":null,"time":null},"app":{},"connection_options":{},"config_block":null}}},"url_prefix":"http://search-op-v2/solr/cody/","manual_proxy":false,"proxy":null},"update_format":"RSolr::JSON::Generator","update_path":"update","options":{"url":"http://search-op-v2/solr/cody"}}},"query":{"params":{"per_page":50,"term":"tag:\"sokoban\"","current_player":null,"sort":"map(difficulty_value,0,0,999) asc"},"parser":"MathWorks::Search::Solr::QueryParser","directives":{"term":{"directives":{"tag":[["tag:\"sokoban\"","","\"","sokoban","\""]]}}},"facets":{"#\u003cMathWorks::Search::Field:0x00007f23704fdc20\u003e":null,"#\u003cMathWorks::Search::Field:0x00007f23704fdb80\u003e":null},"filters":{"#\u003cMathWorks::Search::Field:0x00007f23704fd220\u003e":"\"cody:problem\""},"fields":{"#\u003cMathWorks::Search::Field:0x00007f23704fdf40\u003e":1,"#\u003cMathWorks::Search::Field:0x00007f23704fdea0\u003e":50,"#\u003cMathWorks::Search::Field:0x00007f23704fdd60\u003e":"map(difficulty_value,0,0,999) asc","#\u003cMathWorks::Search::Field:0x00007f23704fdcc0\u003e":"tag:\"sokoban\""},"user_query":{"#\u003cMathWorks::Search::Field:0x00007f23704fdcc0\u003e":"tag:\"sokoban\""},"queried_facets":{}},"options":{"fields":["id","difficulty_rating"]},"join":" "},"results":[{"id":1978,"difficulty_rating":"medium"}]}}