uva10051 - Tower of Cubes(단순 동작)

1752 단어
상태: d[i][j]는 i번째 입방체 j개의 면이 위로 향할 때 탑의 최대 높이를 나타낸다.
상태 이동: dp[i][j]=max{dp[k][l]]+1|a[i][j^1]=a[k][l]};
출력 경로는next 수조로 기록하면 됩니다.
코드는 다음과 같습니다.
#include <cstdio>
#include <cstring>
#define N 505
char ans[6][10] = {"front", "back", "left", "right", "top", "bottom"};
int n, a[N][6], next[N][6][2], d[N][6], flag;
void print_ans(int x, int y, int cur)
{
    if(cur==0) return;
    printf("%d %s
", x, ans[y]); print_ans(next[x][y][0],next[x][y][1],cur-1); } int main () { int cas = 0; while(scanf("%d",&n),n) { for(int i = 1; i <= n; i++) for(int j = 0; j < 6; j++) scanf("%d",&a[i][j]); for(int i = 0; i < 6; i++) d[n][i] = 1; int maxi, maxj, max = 1; for(int i = n-1; i >=1 ; i--) { for(int j = 0; j < 6; j++) { int &ans = d[i][j]; int ansi, ansj; ans = 1; for(int k = n; k > i; k--) for(int l = 0; l < 6; l++) if(a[i][j^1]==a[k][l]&&ans<d[k][l]+1) { ans = d[k][l]+1; ansi = k; ansj = l; } next[i][j][0] = ansi; next[i][j][1] = ansj; if(max<d[i][j]) { max = d[i][j]; maxi = i; maxj = j; } } } flag = max; if(cas) printf("
"); printf("Case #%d
%d
",++cas,max); print_ans(maxi,maxj,max); } return 0; }

좋은 웹페이지 즐겨찾기