Pagini recente » Cod sursa (job #2035635) | Cod sursa (job #2033900) | Cod sursa (job #2064567) | Cod sursa (job #2948407) | Cod sursa (job #1797353)
#include <stdio.h>
#define MAX_LENGTH 10010
struct Solution
{
int value = 0;
int instance = 0;
};
FILE* fin;
FILE* fout;
int n;
int crtLgh;
int nextBuff[MAX_LENGTH] = { 0 };
int nre[MAX_LENGTH] = { 0 };
Solution sol[MAX_LENGTH];
bool isGood = false;
void LoadFiles()
{
fin = fopen("perle.in", "r");
fout = fopen("perle.out", "w");
}
void Init()
{
LoadFiles();
}
void ReadNre()
{
for(int i=0;i<crtLgh;i++)
{
fscanf(fin, "%d", &nre[i]);
}
}
void Complete(int index, int type)
{
int instance = sol[index].instance + 1;
int nextIx = 0;
int index2 = index+1;
while(sol[index2].value != 0)
{
//printf("DA MA\n");
nextBuff[nextIx++] = sol[index2++].value;
}
int ramIndex;
switch(type)
{
case 0:
sol[index].value = 1;
sol[index].instance = instance;
ramIndex = index+1;
break;
case 1:
sol[index].value = 2;
sol[index].instance = instance;
ramIndex = index+1;
break;
case 2:
sol[index].value = 3;
sol[index].instance = instance;
ramIndex = index+1;
break;
case 3:
sol[index].value = 2;
sol[index].instance = instance;
sol[index+1].value = 'B';
sol[index+1].instance = instance;
ramIndex = index+2;
break;
case 4:
sol[index].value = 1;
sol[index].instance = instance;
sol[index+1].value = 'A';
sol[index+1].instance = instance;
sol[index+2].value = 3;
sol[index+2].instance = instance;
sol[index+3].value = 'A';
sol[index+3].instance = instance;
sol[index+4].value = 'C';
sol[index+4].instance = instance;
ramIndex = index+5;
break;
case 5:
sol[index].value = 2;
sol[index].instance = instance;
ramIndex = index+1;
break;
case 6:
sol[index].value = 3;
sol[index].instance = instance;
sol[index+1].value = 'B';
sol[index+1].instance = instance;
sol[index+2].value = 'C';
sol[index+2].instance = instance;
ramIndex = index + 3;
break;
case 7:
sol[index].value = 1;
sol[index].instance = instance;
sol[index+1].value = 2;
sol[index+1].instance = instance;
sol[index+2].value = 'A';
sol[index+2].instance = instance;
ramIndex = index+3;
break;
}
for(int i=0;i<nextIx;i++)
{
sol[ramIndex].value = nextBuff[i];
sol[ramIndex].instance = instance-1;
ramIndex++;
}
}
void Remove(int index, int val)
{
int instance = sol[index].instance;
int fIx = index;
sol[index].value = val;
sol[index].instance = instance-1;
index++;
int backIndex = index;
while(sol[index].instance >= instance)
{
sol[index].value = 0;
sol[index].instance = 0;
index++;
}
while(sol[index].value != 0)
{
if(sol[index].instance < instance)
{
// printf("(%d %d (%d val:%d))\n", fIx, backIndex, index, sol[index].value);
sol[backIndex] = sol[index];
if(index != backIndex)
{
sol[index].instance = 0;
sol[index].value = 0;
}
index++;
backIndex++;
}
else
{
}
}
}
void Process(int index)
{
if(index <= crtLgh && !isGood)
{
/*
for(int i=0;i<=index + 10;i++)
{
if(sol[i].value > 3)
{
printf("%c ", sol[i].value);
}
else
{
printf("%d ", sol[i].value);
}
//rintf("(%d) ", sol[i].instance);
}
printf("(!!!%d)\n",crtLgh);*/
if(index == 0)
{
for(int i=0;i<8;i++)
{
Complete(0, i);
if(sol[index].value == nre[index])
{
Process(index+1);
}
Remove(0, 0);
}
}
else
{
if(index == crtLgh && sol[index].value == 0)
{
//printf("AICIA\n");
isGood = true;
}
else
{
if(index < crtLgh)
{
if(sol[index].value == nre[index])
{
Process(index+1);
}
else
{
if(sol[index].value == 'A')
{
Complete(index, nre[index]-1);
Process(index);
Remove(index, 'A');
}
else
{
if(sol[index].value == 'B')
{
Complete(index, 3);
Process(index);
Remove(index, 'B');
Complete(index, 4);
Process(index);
Remove(index, 'B');
}
else
{
if(sol[index].value == 'C')
{
Complete(index, 5);
Process(index);
Remove(index, 'C');
//printf("TEST!!!!!!\n");
/* for(int i=0;i<=index + 10;i++)
{
if(sol[i].value > 3)
{
printf("%c ", sol[i].value);
}
else
{
printf("%d ", sol[i].value);
}
//rintf("(%d) ", sol[i].instance);
}
printf("(!!!%d)\n",crtLgh);
*/
Complete(index, 6);
Process(index);
Remove(index, 'C');
Complete(index, 7);
Process(index);
Remove(index, 'C');
}
else
{
}
}
}
}
}
}
}
}
}
void WriteBool(bool val)
{
fprintf(fout, "%d\n", val);
}
void Read()
{
fscanf(fin, "%d", &n);
for(int i=0;i<n;i++)
{
fscanf(fin, "%d", &crtLgh);
ReadNre();
isGood = false;
Process(0);
WriteBool(isGood);
}
}
void CloseFiles()
{
fclose(fin);
fclose(fout);
}
void Terminate()
{
CloseFiles();
}
int main(void)
{
Init();
Read();
Terminate();
return 0;
}