⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 p2714_尝试.cpp

📁 高手写的所有acm例程 在acm.zju.edu.cn 上的题目的例程
💻 CPP
字号:
#include <stdio.h>
#include <string.h>

#define MAXN      13
#define Front     0
#define Left      1
#define Back      2
#define Right     3
#define Top       4
#define Bottom    5

const int dx [6] = { 0 , 0 , 0 , 0 , 1 , -1 };
const int dy [6] = { 0 , 1 , 0 , -1 , 0 , 0 };
const int dz [6] = { 1 , 0 , -1 , 0 , 0 , 0 };

int   N;
bool  Have [MAXN] [MAXN] [MAXN];
char  map [6] [MAXN] [MAXN];

bool  range ( int , int , int );
bool  init ();
void  solve ();
bool  check ( int & , int & , int & );

main ()
{
     while ( init () ) {
           solve ();
     }
}

bool check ( int &rx , int &ry , int &rz )
{
     char  col [MAXN] [MAXN] [MAXN];
     int   x , y , z , sx , sy ,sz;
     memset ( col , 0 , sizeof ( col ));
     
     for ( int f = 0; f < 6; f ++ )
         for ( int i = 0; i < N; i ++ )
             for ( int j = 0; j < N; j ++ ) {
                 switch ( f ) {
                        case Front   : x = i , y = j , z = 0; break;
                        case Left    : x = i , y = 0 , z = N - j - 1; break;
                        case Back    : x = i , y = N - j - 1 , z = N - 1; break;
                        case Right   : x = i , y = N - 1 , z = j; break;
                        case Top     : x = 0 , y = j , z = N - i - 1; break;
                        case Bottom  : x = N - 1 , y = j , z = i; break;
                 }
                 
                 for ( ; range ( x , y , z ); x += dx [f] , y += dy [f] , z += dz [f] ) {
                     if ( col [x] [y] [z] && col [x] [y] [z] != map [f] [i] [j] ) { rx = x , ry = y , rz = z; return false; }
                     if ( Have [x] [y] [z] && map [f] [i] [j] == '.' ) { rx = x , ry = y , rz = z; return false; }
                     if ( Have [x] [y] [z] ) { col [x] [y] [z] = map [f] [i] [j]; break; }
                 }
             }
     return true;
}

void solve ()
{
     int   Weight , x , y , z;
     memset ( Have , 1 , sizeof ( Have ));
     for ( Weight = N * N * N; Weight; Weight -- ) {
         if ( check ( x , y , z ) ) break;
         Have [x] [y] [z] = false;
     }
     printf ( "Maximum weight: %d gram(s)\n" , Weight );
}

bool init ()
{
     scanf ( "%d" , &N ); if ( N == 0 ) return false;
     for ( int i = 0; i < N; i ++ )
         for ( int j = 0; j < 6; j ++ )
             scanf ( "%s" , map [j] [i] );
     return true;
}

bool range ( int x , int y , int z )
{
     return x >= 0 && x < N && y >= 0 && y < N && z >= 0 && z < N;
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -