还是普通动规的思路,只不过注意一点,上面那个的下面和下面那个的上面是相同的,要处理一下。
//============================================================================
// Name : 10051.cpp
// Author :
// Version :
// Copyright : Your copyright notice
// Description : Hello World in C++, Ansi-style
//============================================================================
#include <iostream>
#include <cstdio>
#include <cstring>
using namespace std;
typedef struct{
int x, y;
}block;
block pre[600][10], next[600][10], Max;
int maxnum;
int n, t1, t2, m1, m2, t;
int a[600][10], d[600][10];
char s[7][10] = {"", "front", "back", "left", "right", "top", "bottom"};
int main() {
freopen("a.txt", "r", stdin);
int T = 0;
while(scanf("%d", &n)&&n){
T++;
if(T!=1){
printf("\n");
}
printf("Case #%d\n", T);
for(int i = 1;i <= n;i++){
for(int j = 1;j <= 6;j++){
scanf("%d", &a[i][j]);
d[i][j] = 1;
}
}
maxnum = 1;
Max.x = 1;
Max.y = 1;
for(int i1 = 2;i1 <= n;i1++){
for(int i2 = 1;i2 <= 6;i2++){
for(int j = 1;j < i1;j++){
for(int k = 1;k <= 6;k++){
t = k;
if(k%2){
t = t+1;
}
else{
t = t-1;
}
if(a[i1][i2] == a[j][t]){
if(d[i1][i2] < d[j][k]+1){
d[i1][i2] = d[j][k]+1;
pre[i1][i2].x = j;
pre[i1][i2].y = k;
if(maxnum < d[i1][i2]){
maxnum = d[i1][i2];
Max.x = i1;
Max.y = i2;
}
}
}
}
}
}
}
printf("%d\n", maxnum);
if(maxnum == 1){
printf("1 ");
printf("%s\n", s[1]);
}
else{
t1 = Max.x;
t2 = Max.y;
// printf("%d %d\n", t1, t2);
while(d[t1][t2]!=1){
m1 = pre[t1][t2].x;
m2 = pre[t1][t2].y;
next[m1][m2].x = t1;
next[m1][m2].y = t2;
t1 = m1;
t2 = m2;
// printf("%d %d\n", t1, t2);
}
printf("%d ", t1);
printf("%s\n", s[t2]);
// printf("\n");
// printf("%d %d\n", t1, t2);
while(t1!=Max.x){
m1 = next[t1][t2].x;
m2 = next[t1][t2].y;
t1 = m1;
t2 = m2;
// printf("%d %d\n", t1, t2);
printf("%d ", t1);
printf("%s\n", s[t2]);
}
}
}
return 0;
}