Problem 1245. PACMAT 04 - Optimized Ghosts, Equal Speed, 10 Lives

Solution 200793

Submitted on 6 Feb 2013 by Alfonso Nieto-Castanon
  • Size: 2457
  • This is the leading solution.
This solution is locked. To view this solution, you need to provide a solution of the same size or smaller.

Test Suite

Test Status Code Input and Output
1   Pass
%% feval(@assignin,'caller','score',9000);

2   Pass
%% max_moves=2000; % Fixed path expect to succeed by 600 moves map=[... repmat('a',1,28); 'accccccccccccaacccccccccccca'; 'acaaaacaaaaacaacaaaaacaaaaca'; 'acaaaacaaaaacaacaaaaacaaaaca'; 'acaaaacaaaaacaacaaaaacaaaaca'; 'acccccccccccccccccccccccccca'; 'acaaaacaacaaaaaaaacaacaaaaca'; 'acaaaacaacaaaaaaaacaacaaaaca'; 'accccccaaccccaaccccaacccccca'; 'aaaaaacaaaaabaabaaaaacaaaaaa'; 'aaaaaacaaaaabaabaaaaacaaaaaa'; 'aaaaaacaabbbbbbbbbbaacaaaaaa'; 'aaaaaacaabaaabbaaabaacaaaaaa'; 'aaaaaacaabalbbbblabaacaaaaaa'; 'bbbbbbcbbbabbbbbbabbbcbbbbbb'; 'aaaaaacaabalbbbblabaacaaaaaa'; 'aaaaaacaabaaaaaaaabaacaaaaaa'; 'aaaaaacaabbbbbbbbbbaacaaaaaa'; 'aaaaaacaabaaaaaaaabaacaaaaaa'; 'aaaaaacaabaaaaaaaabaacaaaaaa'; 'accccccccccccaacccccccccccca'; 'acaaaacaaaaacaacaaaaacaaaaca'; 'acaaaacaaaaacaacaaaaacaaaaca'; 'acccaacccccccbdcccccccaaccca'; 'aaacaacaacaaaaaaaacaacaacaaa'; 'aaacaacaacaaaaaaaacaacaacaaa'; 'accccccaaccccaaccccaacccccca'; 'acaaaaaaaaaacaacaaaaaaaaaaca'; 'acaaaaaaaaaacaacaaaaaaaaaaca'; 'acccccccccccccccccccccccccca'; repmat('a',1,28);]; map=map-'b'; [nr, nc]=size(map); gmap=map; % Map used by ghosts to simplify PAC Capture gmap(15,6)=Inf; %No tunnel ghosts gmap(15,26)=Inf; gmap(map==-1)=Inf; % walls to Inf gmap(map>2)=Inf; % Elim start points as viable moves, quicker box exit mapdelta=[-1 nr 1 -nr]; % Valid as long as not on an edge gmovxy=[0 -1;1 0;0 1;-1 0]; tunnel=find(map(:,1)==0); % tunnelptr tunnel=[tunnel tunnel+nr*(nc-1)]; % Entrance/Exit Tunnel [pmr, pmc]=find(map==2); % pi 24 row pj 15 column of map ptrpac=find(map==2); ptrpac=find(map==2); ptrpac_start=ptrpac; ptrg_start=find(map>2); map(ptrg_start)=[10 20 30 40];% use deal? [gstartx, gstarty]=find(map>2); lives=10; % Lives movepac=0; while lives && any(mod(map(:),10)==1) && movepac<max_moves movepac=movepac+1; [curdir]=pacmat(map); [pmr, pmc]=find(map==2); if curdir>0 if map(ptrpac+mapdelta(curdir))==-1 % Do nothing - Ran into a Wall elseif map(ptrpac+mapdelta(curdir))>2 % ran into ghost map(ptrpac)=0; % remove PAC from the board lives=lives-1; if lives==0,break;end % reset the board [ptrgx, ptrgy]=find(map>2); ptrg=find(map>2); map(ptrg)=mod(map(ptrg),10); map(ptrpac_start)=2; map(ptrg_start)=[10 20 30 40]; ptrpac=find(map==2); continue; else % legal move map(ptrpac)=0; % Eat Dot and clear PAC ptrpac=ptrpac+mapdelta(curdir); if ptrpac==tunnel(1),ptrpac=tunnel(2)-nr;end if ptrpac==tunnel(2),ptrpac=tunnel(1)+nr;end map(ptrpac)=2; end end % curdir >0 % Ghosts for i=1:4 ghosts=find(map>2); ptrpac=find(map==2); % Target dot=false; [gptrx, gptry]=find(map==10*i); gidx=find(map==10*i); if isempty(gidx) [gptrx, gptry]=find(map==10*i+1); % ghost must be on a dot gidx=find(map==10*i+1); dot=true; end % Find valid ghost moves using gmap % mapdelta=[-1 nr 1 -nr]; gmov=find(map(gidx+mapdelta)==2); % adjacent to PACMAT if ~isempty(gmov) % PAC adjacent lives=lives-1; if lives==0,break;end % reset the board [pmr, pmc]=find(map==2); % PACMAT erase coords map(map==2)=0; [ptrgx, ptrgy]=find(map>2); ptrg=find(map>2); map(ptrg)=mod(map(ptrg),10); map(ptrpac_start)=2; map(ptrg_start)=[10 20 30 40]; ptrpac=find(map==2); break; % Ghost move loop else % gmap no tunnel usage, Walls gmap=map; gmap(15,1)=-1;gmap(15,28)=-1; ptctr=0; gmap(gmap>=0)=Inf; % Ghost algor change gmap(ghosts)=-1; % other ghosts are like walls Ghosts_004/5 gmap(gidx)=Inf; % Ultimate target gmap(ptrpac)=1; % Start at PACMAT and expand to ghost while gmap(gidx)>101 && ptctr<100 % potential boxed dot % find dots, add a counter to distance form location, keep min value % when ptrpac gets a value it will be from nearest dot % find side with dmap(ptrpac)-1 ptctr=ptctr+1; dpts=find(gmap==ptctr); newpt_idx=repmat(dpts,1,4)+repmat(mapdelta,length(dpts),1); gmap(newpt_idx(:))=min(gmap(newpt_idx(:)),ptctr+1); end % Simplified by ghosts are walls: No Ghost Jumping if ~isinf(gmap(gidx)) % Path(s) to Ghost found for gmov=1:4 % execute with a find? if gmap(gidx+mapdelta(gmov))==gmap(gidx)-1,break;end end else gmov=[]; end if ~isempty(gmov) % valid g move : ghost may not stand on ghost map(gptrx,gptry)=mod(map(gptrx,gptry),10); map(gidx+mapdelta(gmov))=map(gidx+mapdelta(gmov))+10*i; end % ~isempty(gmov) standard move - no capture end % ~isempty(gmov) PACMAT adjacent end % i ghost moves end % while alive % dots=length(find(mod(map,10)==1)); % fprintf('moves %i\n',movepac) fprintf('dots %i\n',dots) fprintf('Lives Remaining %i\n',lives) % % Total dots 244 % To Pass need to leave at most 114 dots assert(dots<115,sprintf('Max Dots 114, Dots Remaining %i\n',dots)) %assert(lives>0,sprintf('Three Captures\n')) % ) Lives allowed %assert(~isempty(any(mod(map(:),10)==1)),sprintf('Moves\n',movepac)) if dots>0 % Give credit to staying alive %score=1000-floor(movepac/10)+20*dots; score=3000-floor(movepac/50)+50*dots; else %score=1000-100*lives+movepac; score=2000-200*lives+movepac; end feval( @assignin,'caller','score',floor(min( 9000,score )) );

moves 657 dots 0 Lives Remaining 1

Suggested Problems

More from this Author246

Community Treasure Hunt

Find the treasures in MATLAB Central and discover how the community can help you!

Start Hunting!