sqlrob: (Default)
[personal profile] sqlrob
[livejournal.com profile] jenbooks got addicted to Professor Layton and the Curious Village, a game that I had preordered and had been waiting for for a while. She wanted help with one of the puzzles, and after trying for a few minutes, I solved it a different way

Well, there was another puzzle late in the game neither one of us had much luck with, so I did the same thing with that puzzle as well.


#include <algorithm>
#include <stdio.h>
#include <vector>

#include <string>

class TooManyQueens5 /* aka Puzzle 130 */
{
	std::vector<int> m_curArray;

	unsigned m_numAnswers;
	
	bool checkAnswer() const;
	void printAnswer() const;

public:
	TooManyQueens5();
	void solve();
};

class Puzzle99 /* aka 33333 */

{
	std::vector<int> m_curArray;
	
	int m_top;

	int m_bottom;
	
	bool checkAnswer();
	void printAnswer() const;

	
public:
	Puzzle99();
	void solve();
};

int main (int argc, char * const argv[])
{

	printf("Professor Layton solver by sqlrob\n");
	printf("Solving Puzzle 99 - 33333\n");
	
	Puzzle99 diff;
	diff.solve();

	
	printf("\n\n");
	
	printf("Solving Puzzle 130 - Too Many Queens 5\n");
	TooManyQueens5 queens;
	queens.solve();

	
	printf("\n\n");
	
	return 0;
}

class Incrementer

{
	int m_val;
public:
	Incrementer(int start = 0) : m_val(start) { }

	int operator()() { return m_val++; }
};

TooManyQueens5::TooManyQueens5() : m_numAnswers(0)
{

	m_curArray.resize(8);
	Incrementer inc(0);
	
	std::generate(m_curArray.begin(),m_curArray.end(),inc);
}

void TooManyQueens5::solve()
{
	do
	{
		if (checkAnswer())
		{
			++m_numAnswers;

			printAnswer();
		}
	}
	while(std::next_permutation(m_curArray.begin(),m_curArray.end()));
}

bool TooManyQueens5::checkAnswer() const
{
	for (unsigned i = 0; i < 7; ++i)
	{

		for (unsigned j = i+1; j < 8; ++j)
		{

			if ((m_curArray[i] + (j-i) == m_curArray[j]) || (m_curArray[i] - (j-i) == m_curArray[j]))
			{

				return false;
			}
		}
	}
	
	return true;
}

void TooManyQueens5::printAnswer() const

{
	printf("Found answer #%d:\n",m_numAnswers);
	for (unsigned i=0;i<8;++i)
	{

		std::string row(8,'-');
		row[m_curArray[i]] = 'X';

		printf("%s\n",row.c_str());
	}
	printf("\n\n");
}

Puzzle99::Puzzle99() : m_top(0),m_bottom(0)
{
	m_curArray.resize(9);

	Incrementer inc(1);
	std::generate(m_curArray.begin(),m_curArray.end(),inc);
}

bool Puzzle99::checkAnswer()
{
	m_top = m_curArray[0] + 10*m_curArray[1] + 100 * m_curArray[2] + 1000 * m_curArray[3] + 10000 * m_curArray[4];

	m_bottom = m_curArray[5] + 10 * m_curArray[6] + 100 * m_curArray[7] + 1000 * m_curArray[8];

	return (m_top - m_bottom) == 33333;	
}

void Puzzle99::solve()
{

	do
	{
		if (checkAnswer())
		{
			printAnswer();
		}
	}

	while(std::next_permutation(m_curArray.begin(),m_curArray.end()));
}

void Puzzle99::printAnswer() const
{
	printf("%d-%d=33333\n",m_top,m_bottom);
}




Code made pretty by C++2HTML

Profile

sqlrob: (Default)
sqlrob

April 2009

S M T W T F S
   1234
567891011
12131415161718
192021 22232425
2627282930  

Most Popular Tags

Style Credit

Expand Cut Tags

No cut tags