Cod sursă (job #295618)

Utilizator avatar micutu Andrei Vasile Cont Fraudulent micutu IP ascuns
Problemă Immortal (clasele 9-10) Compilator cpp | 2.23 kb
Rundă Arhiva de probleme Status evaluat
Dată 26 mar. 2017 07:00:50 Scor 30
#include <fstream>

#define NMAX 23
#define IMMAX 32

using namespace std;

struct nemuritor{ int x, y, dead; };
struct mutare{ int a1, a2, a3, a4; };

int N, M, I, A[NMAX][NMAX], solutie, dx[4] = {0, -1, 0, 1}, dy[4] = {-1, 0, 1, 0}, doneMut;
nemuritor IM[IMMAX];
mutare MUT[IMMAX];

void ReadAll(void)
{
	ifstream fin("immortal.in");
	
	int i;
	
	fin >>N >>M >>I;
	
	doneMut = I - 1;
	
	for (i = 1; i <= I; i++)
		fin >>IM[i].x >>IM[i].y, A[IM[i].x][IM[i].y] = i;
	
	fin.close();
}

void SolveBack(int Alive)
{
	int i, j, bef;
	
	if (Alive == 1) 
		solutie = 1;
	else
	{
		for (i = 1; i <= I && !solutie; i++)
			if (IM[i].dead == 0)
			{
				for (j = 0; j < 4 && !solutie; j++)
					if (A[ IM[i].x + dx[j] ][ IM[i].y + dy[j] ] > 0 && 
						A[ IM[i].x + 2 * dx[j] ][ IM[i].y +  2 * dy[j] ] <= 0 && 
						IM[i].x + 2 * dx[j] <= N && 
						IM[i].x + 2 * dx[j] > 0 &&
						IM[i].y + 2 * dy[j] > 0 &&
						IM[i].y + 2 * dy[j] <= M)
					{
						IM[ A[ IM[i].x + dx[j] ][ IM[i].y + dy[j] ] ].dead = 1;
						A[ IM[i].x + dx[j] ][ IM[i].y + dy[j] ] = -A[ IM[i].x + dx[j] ][ IM[i].y + dy[j] ]; 
						
						A[ IM[i].x ][ IM[i].y ] = 0;
						bef = A[ IM[i].x + 2 * dx[j] ][ IM[i].y +  2 * dy[j] ];
						A[ IM[i].x + 2 * dx[j] ][ IM[i].y +  2 * dy[j] ] = i;
						IM[i].x += 2*dx[j];
						IM[i].y += 2*dy[j];
						
						SolveBack(Alive - 1);
						
						IM[i].x -= 2 * dx[j];
						IM[i].y -= 2 * dy[j];
						
						A[ IM[i].x ][ IM[i].y ] = i;
						A[ IM[i].x + 2 * dx[j] ][ IM[i].y +  2 * dy[j] ] = bef;
						
						A[ IM[i].x + dx[j] ][ IM[i].y + dy[j] ] = -A[ IM[i].x + dx[j] ][ IM[i].y + dy[j] ]; 
						IM[ A[ IM[i].x + dx[j] ][ IM[i].y + dy[j] ] ].dead = 0;

						if (solutie)
						{
							MUT[doneMut].a1 = IM[i].x; 
							MUT[doneMut].a2 = IM[i].y;
							MUT[doneMut].a3 = IM[i].x + 2 * dx[j];
							MUT[doneMut].a4 = IM[i].y + 2 * dy[j];
							doneMut --;
						}
					}						
			}
	}
	
}

void WriteAll(void)
{
	ofstream fout("immortal.out");
	
	int i;
	
	for (i = 1; i < I; i++)
		fout <<MUT[i].a1 <<' '<<MUT[i].a2 <<' '<<MUT[i].a3 <<' '<<MUT[i].a4 <<'\n';
	
	fout.close();
}

int main()
{	
	ReadAll();
	
	SolveBack(I);
	
	WriteAll();
	
	return 0;
}