【日刷】LA2995

来源:互联网 发布:印度尼西亚华人知乎 编辑:程序博客网 时间:2024/05/17 22:36

一道acmfinal

学到的东西

  1. 输入函数read_char
    来减少不必要的循环;
  2. get
    函数枚举各种情况要有空间想象力和耐心;
  3. #define REP 与i,j,k,的用法;
  4. ,for(;;),的骚操作,不断循环直到break;
  5. 预先想好算法
#include<iostream>using namespace std;#define REP(i,n) for(int i=0;i<(n);i++)int n;char read_char() {    char c;    for (;; ) {        c = getchar();        if ((c >= 'A'&&c <= 'Z') || c == '.') return c;    }}void get(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 - 1 - j; y = p; z = i; }    if (k == 2) { x = n - 1 - p; y = n - 1 - j; z = i; }    if (k == 3) { x = j; y = n - p - 1; z = i; }    if (k == 4) { x = n - 1 - i; y = j; z = p; }    if (k == 5) { x = i; y = j; z = n - 1 - p; }};char view[6][10][10], pos[10][10][10];int main() {    while (cin >> n) {        if (n == 0)break;        REP(i, n) REP(k, 6) REP(j, n) view[k][i][j] = read_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; get(k, i, j, p, x, y, z); pos[x][y][z] = '.'; } };        for (;;) {            bool done = true;            REP(i, n)REP(j, n)REP(k, 6) if (view[k][i][j]!='.' ) {                REP(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] = '.';                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;}

LA上
要写if(n==0)break;
才能过
icpc live achive

原创粉丝点击