/* Time Limit exceeded 还有没有什么更好的方法*/
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#define MAX 200
#define N 4
#define BUFLEN 30
typedef struct point3 {
int x, y, z;
} point3;
typedef struct typea {
point3 p[N];
int n;
} typea;
int rot(typea ta, int type, int angle, typea *res);
int translate(typea ta, int type, typea *res);
point3 dotRotX(point3 pa, int angle, point3 pbase);
point3 dotRotY(point3 pa, int angle, point3 pbase);
point3 dotRotZ(point3 pa, int angle, point3 pbase);
point3 dotTranslateXPos(point3 pa);
point3 dotTranslateXNeg(point3 pa);
point3 dotTranslateYPos(point3 pa);
point3 dotTranslateYNeg(point3 pa);
point3 dotTranslateZPos(point3 pa);
point3 dotTranslateZNeg(point3 pa);
int is_ok(point3 pa);
int is_equal(typea ta, typea tb);
int is_dotEqual(point3 pa, point3 pb);
void dfs(typea t, int type);
void init();
void depthFistSearch(int cur);
int is_feasible(typea ta);
void set_flag(typea ta, int flag);
void clear_flag(typea ta);
void output();
int cmp_typea(const void *a, const void *b);
typea taArray[MAX], tAllArray[7][MAX];
int lenArray[7];
int len;
int vis[BUFLEN];
int solnum;
int main()
{
int i;
char buf[BUFLEN];
int pos;
char *p = NULL, *tmp = NULL;
typea ta;
#ifndef ONLINE_JUDGE
freopen("d:\\UVa\\uva_in.txt", "r", stdin);
freopen("d:\\UVa\\uva_out.txt", "w", stdout);
#endif
init();
while (gets(buf) != NULL) {
memset(vis, 0, sizeof(vis));
tmp = buf;
i = 0;
ta.n = 4;
while ((p = strchr(tmp, 'a')) != NULL) {
pos = p - buf;
tmp = p + 1;
ta.p[i].x = pos % 3;
ta.p[i].y = pos % 9 / 3;
ta.p[i].z = pos / 9;
i++;
}
taArray[0] = ta;
len = 1;
dfs(ta, 0);
memcpy(tAllArray[0], taArray, sizeof(struct typea) * len);
lenArray[0] = len;
depthFistSearch(0);
printf("\n");
}
return 0;
}
int rot(typea ta, int type, int angle, typea *res)
{
int i, n = ta.n;
res->n = n;
if (type == 0) {
for (i = 0; i < n; i++) {
res->p[i] = dotRotX(ta.p[i], angle, ta.p[1]);
}
} else if (type == 1) {
for (i = 0; i < n; i++) {
res->p[i] = dotRotY(ta.p[i], angle, ta.p[1]);
}
} else if (type == 2) {
for (i = 0; i < n; i++) {
res->p[i] = dotRotZ(ta.p[i], angle, ta.p[1]);
}
}
for (i = 0; i < n; i++) {
if (!is_ok(res->p[i]))
return 0;
}
return 1;
}
point3 dotRotX(point3 pa, int angle, point3 pbase)
{
point3 tmp = pbase;
int coffia, coffib;
pa.x -= pbase.x;
pa.y -= pbase.y;
pa.z -= pbase.z;
if (angle == 90) {
coffia = 0;
coffib = 1;
} else if (angle == 180) {
coffia = -1;
coffib = 0;
} else if (angle == 270) {
coffia = 0;
coffib = -1;
}
tmp.x = pa.x;
tmp.y = pa.y * coffia - pa.z * coffib;
tmp.z = pa.y * coffib + pa.z * coffia;
return tmp;
}
point3 dotRotY(point3 pa, int angle, point3 pbase)
{
point3 tmp = pbase;
int coffia, coffib;
pa.x -= pbase.x;
pa.y -= pbase.y;
pa.x -= pbase.z;
if (angle == 90) {
coffia = 0;
coffib = 1;
} else if (angle == 180) {
coffia = -1;
coffib = 0;
} else if (angle == 270) {
coffia = 0;
coffib = -1;
}
tmp.x += pa.x * coffia + pa.z * coffib;
tmp.y += pa.y;
tmp.z += -pa.x * coffib + pa.z * coffia;
return tmp;
}
point3 dotRotZ(point3 pa, int angle, point3 pbase)
{
point3 tmp = pbase;
int coffia, coffib;
pa.x -= pbase.x;
pa.y -= pbase.y;
pa.z -= pbase.z;
if (angle == 90) {
coffia = 0;
coffib = 1;
} else if (angle == 180) {
coffia = -1;
coffib = 0;
} else if (angle == 270) {
coffia = 0;
coffib = -1;
}
tmp.x += pa.x * coffia - pa.y * coffib;
tmp.y += pa.x * coffib + pa.y * coffia;
tmp.z += pa.z;
return tmp;
}
int is_ok(point3 pa)
{
if (pa.x < 0 || pa.x > 2 || pa.y < 0 || pa.y > 2 || pa.z < 0 || pa.z > 2)
return 0;
return 1;
}
point3 dotTranslateXPos(point3 pa)
{
point3 tmp;
tmp.x = pa.x + 1;
tmp.y = pa.y;
tmp.z = pa.z;
return tmp;
}
point3 dotTranslateXNeg(point3 pa)
{
point3 tmp;
tmp.x = pa.x - 1;
tmp.y = pa.y;
tmp.z = pa.z;
return tmp;
}
point3 dotTranslateYPos(point3 pa)
{
point3 tmp;
tmp.x = pa.x;
tmp.y = pa.y + 1;
tmp.z = pa.z;
return tmp;
}
point3 dotTranslateYNeg(point3 pa)
{
point3 tmp;
tmp.x = pa.x;
tmp.y = pa.y - 1;
tmp.z = pa.z;
return tmp;
}
point3 dotTranslateZPos(point3 pa)
{
point3 tmp;
tmp.x = pa.x;
tmp.y = pa.y;
tmp.z = pa.z + 1;
return tmp;
}
point3 dotTranslateZNeg(point3 pa)
{
point3 tmp;
tmp.x = pa.x;
tmp.y = pa.y;
tmp.z = pa.z - 1;
return tmp;
}
int translate(typea ta, int type, typea *res)
{
int i, n;
n = ta.n;
res->n = n;
if (type == 0) {
for (i = 0; i < n; i++) {
res->p[i] = dotTranslateXPos(ta.p[i]);
}
} else if (type == 1) {
for (i = 0; i < n; i++) {
res->p[i] = dotTranslateXNeg(ta.p[i]);
}
} else if (type == 2) {
for (i = 0; i < n; i++) {
res->p[i] = dotTranslateYPos(ta.p[i]);
}
} else if (type == 3) {
for (i = 0; i < n; i++) {
res->p[i] = dotTranslateYNeg(ta.p[i]);
}
} else if (type == 4) {
for (i = 0; i < n; i++) {
res->p[i] = dotTranslateZPos(ta.p[i]);
}
} else if (type == 5) {
for (i = 0; i < n; i++) {
res->p[i] = dotTranslateZNeg(ta.p[i]);
}
}
for (i = 0; i < n; i++) {
if (!is_ok(res->p[i]))
return 0;
}
return 1;
}
void dfs(typea t, int type)
{
int i, j, k;
int flag, ok;
typea tmp;
if (type) {
for (i = 0; i < 3; i++) {
for (j = 0; j < 3; j++) {
flag = rot(t, i, j * 90 + 90, &tmp);
if (flag) {
ok = 1;
for (k = 0; k < len; k++) {
if (is_equal(tmp, taArray[k])) {
ok = 0;
break;
}
}
if (ok) {
taArray[len++] = tmp;
dfs(tmp, type);
}
}
}
}
}
for (i = 0; i < 6; i++) {
flag = translate(t, i, &tmp);
if (flag) {
ok = 1;
for (k = 0; k < len; k++) {
if (is_equal(tmp, taArray[k])) {
ok = 0;
break;
}
}
if (ok) {
taArray[len++] = tmp;
dfs(tmp, type);
}
}
}
}
int is_equal(typea ta, typea tb)
{
int i, n;
n = ta.n;
qsort(ta.p, n, sizeof(struct point3), cmp_typea);
qsort(tb.p, n, sizeof(struct point3), cmp_typea);
for (i = 0; i < n; i++) {
if (!is_dotEqual(ta.p[i], tb.p[i]))
return 0;
}
return 1;
}
int is_dotEqual(point3 pa, point3 pb)
{
if (pa.x != pb.x)
return 0;
if (pa.y != pb.y)
return 0;
if (pa.z != pb.z)
return 0;
return 1;
}
void init()
{
int i;
typea ta;
ta.n = 3;
ta.p[0].x = 1, ta.p[0].y = 0, ta.p[0].z = 0;
ta.p[1].x = 0, ta.p[1].y = 0, ta.p[1].z = 0;
ta.p[2].x = 0, ta.p[2].y = 1, ta.p[2].z = 0;
taArray[0] = ta;
len = 1;
dfs(ta, 1);
memcpy(tAllArray[1], taArray, sizeof(struct typea) * len);
lenArray[1] = len;
ta.n = 4;
ta.p[0].x = 0, ta.p[0].y = 0, ta.p[0].z = 0;
ta.p[1].x = 0, ta.p[1].y = 1, ta.p[1].z = 0;
ta.p[2].x = 1, ta.p[2].y = 1, ta.p[2].z = 0;
ta.p[3].x = 0, ta.p[3].y = 2, ta.p[3].z = 0;
taArray[0] = ta;
len = 1;
dfs(ta, 1);
memcpy(tAllArray[2], taArray, sizeof(struct typea) * len);
lenArray[2] = len;
ta.n = 4;
ta.p[0].x = 2, ta.p[0].y = 0, ta.p[0].z = 0;
ta.p[1].x = 1, ta.p[1].y = 0, ta.p[1].z = 0;
ta.p[2].x = 1, ta.p[2].y = 1, ta.p[2].z = 0;
ta.p[3].x = 0, ta.p[3].y = 1, ta.p[3].z = 0;
taArray[0] = ta;
len = 1;
dfs(ta, 1);
memcpy(tAllArray[3], taArray, sizeof(struct typea) * len);
lenArray[3] = len;
ta.n = 4;
ta.p[0].x = 1, ta.p[0].y = 0, ta.p[0].z = 0;
ta.p[1].x = 0, ta.p[1].y = 0, ta.p[1].z = 0;
ta.p[2].x = 0, ta.p[2].y = 1, ta.p[2].z = 0;
ta.p[3].x = 0, ta.p[3].y = 0, ta.p[3].z = 1;
taArray[0] = ta;
len = 1;
dfs(ta, 1);
memcpy(tAllArray[4], taArray, sizeof(struct typea) * len);
lenArray[4] = len;
ta.n = 4;
ta.p[0].x = 0, ta.p[0].y = 0, ta.p[0].z = 0;
ta.p[1].x = 0, ta.p[1].y = 1, ta.p[1].z = 0;
ta.p[2].x = 1, ta.p[2].y = 1, ta.p[2].z = 0;
ta.p[3].x = 1, ta.p[3].y = 1, ta.p[3].z = 1;
taArray[0] = ta;
len = 1;
dfs(ta, 1);
memcpy(tAllArray[5], taArray, sizeof(struct typea) * len);
lenArray[5] = len;
ta.n = 4;
ta.p[0].x = 0, ta.p[0].y = 0, ta.p[0].z = 0;
ta.p[1].x = 0, ta.p[1].y = 1, ta.p[1].z = 0;
ta.p[2].x = 0, ta.p[2].y = 1, ta.p[2].z = 1;
ta.p[3].x = 1, ta.p[3].y = 1, ta.p[3].z = 1;
taArray[0] = ta;
len = 1;
dfs(ta, 1);
memcpy(tAllArray[6], taArray, sizeof(struct typea) * len);
lenArray[6] = len;
}
int is_feasible(typea ta)
{
int n = ta.n, i;
int x, y, z;
int sum;
for (i = 0; i < n; i++) {
x = ta.p[i].x;
y = ta.p[i].y;
z = ta.p[i].z ;
sum = z * 9 + y * 3 + x;
if (vis[sum])
return 0;
}
return 1;
}
void set_flag(typea ta, int flag)
{
int n = ta.n, i;
int x, y, z;
int sum;
for (i = 0; i < n; i++) {
x = ta.p[i].x;
y = ta.p[i].y;
z = ta.p[i].z ;
sum = z * 9 + y * 3 + x;
vis[sum] = flag + 1;
}
}
void clear_flag(typea ta)
{
int n = ta.n, i;
int x, y, z;
int sum;
for (i = 0; i < n; i++) {
x = ta.p[i].x;
y = ta.p[i].y;
z = ta.p[i].z ;
sum = z * 9 + y * 3 + x;
vis[sum] = 0;
}
}
void output()
{
int i;
for (i = 0; i < 27; i++)
printf("%c", vis[i] - 1 + 'a');
printf("\n");
}
void depthFistSearch(int cur)
{
int i, length;
if (cur >= 7) {
output();
return;
}
length = lenArray[cur];
for (i = 0; i < length; i++) {
if (is_feasible(tAllArray[cur][i])) {
set_flag(tAllArray[cur][i], cur);
depthFistSearch(cur + 1);
clear_flag(tAllArray[cur][i]);
}
}
}
int cmp_typea(const void *a, const void *b)
{
point3 *pa = a, *pb = b;
if (pa->x != pb->x)
return pa->x - pb->x;
if (pa->y != pb->y)
return pa->y - pb->y;
return pa->z - pb->z;
}
UVa197 - Cube(TLE)
最新推荐文章于 2019-05-21 15:14:32 发布