Az alábbi letöltési lehetőségek közül választhatsz: (
segítség)
Típus: text/plain
Tartalmaz szöveget
Karakterkódolás: utf-8
Méret: 3 KB
#include <fstream>
using namespace std;
#define MaxM 1001
typedef unsigned char byte;
typedef unsigned short word;
int MB[16] = {5, 1, 2, 1, 3, 1, 2, 1, 4, 1, 2, 1, 3, 1, 2, 1};
word Dat[MaxM];
int MinFrom[MaxM];
inline int min (int A, int B) {
return A < B ? A : B;
}
void FillMinFrom (void);
bool CanBe (byte, byte, byte, int);
int main (int nArgs, char * Arg []) {
int Num, M;
if (nArgs < 3)
return 1;
fstream fIn(Arg[1], fstream::in), fOut(Arg[2], fstream::out);
if (fIn.fail() | fOut.fail()) {
fIn.close();
fOut.close();
return 1;
}
fIn >> Num;
for (int I = 0; I < Num; I++) {
M = 0;
do
fIn >> Dat[M++];
while (Dat[M - 1] != 0);
FillMinFrom();
fOut << (CanBe(1, 0, 0, 0) ? "IGEN" : "NEM") << endl;
}
fIn.close();
fOut.close();
return 0;
}
void FillMinFrom (void) {
int I;
for (I = 0; Dat[I]; I++);
MinFrom[I--] = 5;
for (; I >= 0; I--)
MinFrom[I] = min(MinFrom[I + 1], Dat[I]);
}
bool CanBe (byte A, byte C, byte D, int X) {
int Mask = ~((1 << MinFrom[X]) - 1);
C &= Mask;
D &= Mask;
switch (Dat[X]) {
default:
return MB[C] >= A && MB[D] >= A;
case 1:
return A == 1 && CanBe(A, C, D, X + 1);
case 2:
if (A > 2)
return false;
if (A == 2 || (C & 3) == 2 || (D & 3) == 2)
return CanBe(A, C, D, X + 1);
if (MinFrom[X] > 1)
return CanBe(2, C, D, X + 1);
return CanBe(A, C | 2, D, X + 1) || CanBe(A, C, D | 2, X + 1);
case 3:
if (A > 3)
return false;
if (A == 3 || (C & 7) == 4 || (D & 7) == 4)
return CanBe(A, C, D, X + 1);
if (MinFrom[X] > 2)
return CanBe(3, C, D, X + 1);
return ((C & 3) == 0 && CanBe(A, C | 4, D, X + 1)) || ((D & 3) == 0 && CanBe(A, C, D | 4, X + 1));
case 4:
if (A > 4)
return false;
if (A == 4 || C == 8 || D == 8)
return CanBe(A, C, D, X + 1);
if (MinFrom[X] > 3)
return true;
return ((C & 7) == 0 && CanBe(A, C | 8, D, X + 1)) || ((D & 7) == 0 && CanBe(A, C, D | 8, X + 1));
}
}