Cod sursa(job #2236327)

Utilizator M.AnaAna Marginean M.Ana Data 29 august 2018 10:23:40
Problema Fractal Scor 70
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.72 kb
#include <iostream>
#include <fstream>
#include <vector>
using namespace std;

ifstream in;
ofstream out;

void rotate_left(vector<int> &directions)
{
	for(size_t i = 0; i < directions.size(); i++)
	{
		if(directions[i] % 2 == 0)
		{
			directions[i]--;
		}
		else
		{
			directions[i]++;
		}
	}
}

void mirror(vector<int> &directions)
{
	for(size_t i = 0; i < directions.size(); i++)
	{
		switch(directions[i])
		{
		case 1:
			directions[i] = 3;
			break;
		case 2:
			directions[i] = 4;
			break;
		case 3:
			directions[i] = 1;
			break;
		case 4:
			directions[i] = 2;
			break;
		}
	}
}

void next_degree(vector<int> &directions)
{
	vector<int> old_directions;
	old_directions.insert(old_directions.end(), directions.begin(), directions.end());

	directions.push_back(2);
	directions.insert(directions.end(), directions.begin(), directions.end() - 1);

	rotate_left(old_directions);
	directions.insert(directions.begin(), 1);
	directions.insert(directions.begin(), old_directions.begin(), old_directions.end());

	directions.push_back(3);
	mirror(old_directions);
	directions.insert(directions.end(), old_directions.begin(), old_directions.end());
}

int main() {
	int k, x, y, steps = 0, tempx = 1, tempy = 1;

	vector<int> directions;
	directions.push_back(1);
	directions.push_back(2);
	directions.push_back(3);

	in.open("fractal.in");
	in >> k >> x >> y;
	in.close();

	for(int i = 0; i < k - 1; i++)
	{
		next_degree(directions);
	}

	for(auto i: directions)
	{
		if(tempx == x && tempy == y)
			break;

		switch(i)
		{
			case 1:
				tempy++;
				break;
			case 2:
				tempx++;
				break;
			case 3:
				tempy--;
				break;
			case 4:
				tempx--;
				break;
		}

		steps++;
	}

	out.open("fractal.out");
	out << steps;
	out.close();

	return 0;
}