WF的题目水平果然不一般,看着刘汝佳的代码,才写了下来。。。
char pos[M][M][M], view[6][M][M]; int n; char get_char() { char ch; while(1) { ch = getchar(); if((ch<='Z'&&ch>='A')||ch=='.') return ch; } } void getpos(int k, int i, int j, int p, int &x, int &y, int &z) { if(k==0) { x = p, y = j, z = i; } if(k==1) { x = n-j-1, y = p, z = i; } if(k==2) { x = n-p-1, y = n-j-1, z = i; } if(k==3) { x = j, y = n-p-1; z = i; } if(k==4) { x = n-i-1, y = j; z = p; } if(k==5) { x = i; y = j, z = n-p-1; } } int main() { while(scanf("%d", &n) && n) { REP(i, n) REP(k, 6) REP(j, n) view[k][i][j] = get_char(); REP(i, n) REP(j, n) REP(k, n) pos[i][j][k] = '#'; REP(k, 6) REP(i, n) REP(j, n) if(view[k][i][j]=='.') REP(p, n) { int x, y, z; getpos(k, i, j, p, x, y, z); pos[x][y][z] = '.'; } while(1) { bool done = true; REP(k, 6) REP(i, n) REP(j, n) if(view[k][i][j]!='.') REP(p, n) { int x, y, z; getpos(k, i, j, p, x, y, z); if(pos[x][y][z]=='.') continue; if(pos[x][y][z]=='#') { pos[x][y][z] = view[k][i][j]; break; } if(pos[x][y][z]==view[k][i][j]) break; pos[x][y][z] = '.'; done = false; } if(done) break; } int ans = 0; REP(i, n) REP(j, n) REP(k, n) if(pos[i][j][k]!='.') ++ans; printf("Maximum weight: %d gram(s)\n", ans); } return 0; }