World Final La 2995
题目感觉不难,模拟提,思路有点绕,照着刘汝佳大大的代码打了一遍,
虽然不难,但是学到了很多技巧!
#include<iostream>
#include<cstdio>
#include<cstring>
#include<cmath>
#include<algorithm>
#define Loop(i,n) for(int i = 0; i < (n); ++i)
using namespace std;
int n;
char pos[10][10][10];
char view[6][10][10];
char read_char() { //666这种输入6666
char ch; // 新技能get.
while(1) {
ch = getchar();
if((ch >= 'A' && ch <= 'Z') || ch == '.') return ch;
}
}
void Get(int k,int i,int j,int len,int &x,int &y,int &z) { //len相当于深度吧。
if(k == 0) x = len, y = j, z = i; // 获取当前view【k】【i】【j】 在立方体的位置
if(k == 1) x = n-1-j, y = len, z = i; // 3维,故有距离表面的深度.
if(k == 2) x = n-1-len, y = n-1-j, z = i;
if(k == 3) x = j, y = n-1-len, z = i;
if(k == 4) x = n-1-i, y = j, z = len;
if(k == 5) x = i, y = j, z = n-1-len;
}
int main() {
while(cin >> n && n) {
memset(pos,'#',sizeof(pos));
Loop(i,n) Loop(k,6) Loop(j,n) view[k][i][j] = read_char();
Loop(k,6) Loop(i,n) Loop(j,n) if(view[k][i][j] == '.')
Loop(p,n) {
int x,y,z;
Get(k,i,j,p,x,y,z);
pos[x][y][z] = '.';
}
while(1) {
bool jug = true;
Loop(k,6) Loop(i,n) Loop(j,n) if(view[k][i][j] != '.') {
Loop(p,n) {
int x, y, z;
Get(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] = '.';
jug = false;
}
}
if(jug) break;
}
int ans = 0;
Loop(i,n) Loop(j,n) Loop(k,n)
if(pos[i][j][k] != '.') ans++;
printf("Maximum weight: %d gram(s)\n",ans);
}
return 0;
}