10051
还是普通动规的思路,只不过注意一点,上面那个的下面和下面那个的上面是相同的,要处理一下。
//============================================================================ // 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; }