#include <cstdlib>

#include <mazegameD2solver01.h>


mazegameD2solver01::mazegameD2solver01(mazegameD2state01 & mg_)
  : mg(mg_), vi(mg.mz.vi)
{
}

void mazegameD2solver01::reset()
{
  mg.path.clear();
  mg.path.push_back(mg.gamestart);

  visited.clear();
  visited.insert(0);
  visited.insert(mg.gamestart);
}

boolc mazegameD2solver01::pathcontains(uintc k) const
{
  assertreturnfalse(k!=0);

  for (uint i=0; i<mg.path.size(); ++i)
  {
    if (mg.path[i]==k)
      return true;
  }
 
  return false; 
}

boolc mazegameD2solver01::operator ! () const
{
  if (pathcontains(mg.gamefinish))
    return false;

  return true;
}

void mazegameD2solver01::operator ++ ()
{
  // Try moving forward.

  uint cpi=mg.currentpos();
  assert(cpi!=0);

  uint k2;
  uint gi[4];
  uint gisize=0;
  for (uint i=0; i<4; ++i)
  {
    k2 = vi[cpi].ni[i];
    if (k2==0)
      continue;

    if (visited.find(k2)!=visited.end())
      continue;

    gi[gisize] = k2;
    ++gisize;
  }

  if (gisize!=0)
  {
    // pick one and move forward
    k2 = gi[ rand() % gisize ];
    mg.path.push_back(k2);
    visited.insert(k2);
    return;
  } 
    
  // Must backtrack.
  assert(mg.path.size()>1);
  mg.path.pop_back();
}


