• POJ 3792 Area of Polycubes(模拟)


    POJ 3792

    大意:

    按顺序给你一堆正方体,如果当前输入的正方体上下左右前后都没有跟之前的正方体有连接,就输出NO,并输出当前是第几个。如多每次输入的正方体跟之前的都有连接,那么最后输出组成的几何体的表面积。

    思路:一步一步模拟就行。注意:1.要判一下有重复的输入,如果有重复的输入,要输出NO,并输出第几。。2.注意下标不要向下溢出。

     1 #include <stdio.h>
     2 #include <algorithm>
     3 #include <vector>
     4 #include <string.h>
     5 #define max(a, b) ((a)>(b)?(a):(b))
     6 using namespace std;
     7 
     8 int T;
     9 int n;
    10 bool vis[110][110][110];
    11 
    12 struct node
    13 {
    14     int x, y, z;
    15 } P[1010];
    16 
    17 void Solve()
    18 {
    19     scanf("%d", &T);
    20     for(int tt = 1; tt <= T; ++tt)
    21     {
    22         memset(vis, false, sizeof(vis));
    23         scanf("%d", &n);
    24         printf("%d ", tt);
    25         scanf("%d,%d,%d", &P[1].x, &P[1].y, &P[1].z);
    26         P[1].x++;
    27         P[1].y++;
    28         P[1].z++;
    29         vis[P[1].x][P[1].y][P[1].z] = true;
    30         bool flag = true;
    31         for(int i = 2; i <= n; ++i)
    32         {
    33             scanf("%d,%d,%d", &P[i].x, &P[i].y, &P[i].z);
    34             P[i].x++;
    35             P[i].y++;
    36             P[i].z++;
    37             if(vis[P[i].x][P[i].y][P[i].z] == true)
    38             {
    39                 if(flag)
    40                 {
    41                     printf("NO %d
    ", i);
    42                     flag = false;
    43                 }
    44                 continue;
    45             }
    46             vis[P[i].x][P[i].y][P[i].z] = true;
    47             if(!(vis[P[i].x-1][P[i].y][P[i].z] || vis[P[i].x+1][P[i].y][P[i].z] || vis[P[i].x][P[i].y-1][P[i].z] || vis[P[i].x][P[i].y+1][P[i].z] || vis[P[i].x][P[i].y][P[i].z-1] || vis[P[i].x][P[i].y][P[i].z+1]))
    48             {
    49                 if(flag)
    50                 {
    51                     printf("NO %d
    ", i);
    52                     flag = false;
    53                 }
    54             }
    55         }
    56         if(flag)
    57         {
    58             int sum =n*6;
    59             for(int i = 1; i <= n; ++i)
    60             {
    61                 if(vis[P[i].x-1][P[i].y][P[i].z])
    62                 {
    63                     sum -= 1;
    64                 }
    65                 if(vis[P[i].x+1][P[i].y][P[i].z])
    66                 {
    67                     sum -= 1;
    68                 }
    69                 if(vis[P[i].x][P[i].y-1][P[i].z])
    70                 {
    71                     sum -= 1;
    72                 }
    73                 if(vis[P[i].x][P[i].y+1][P[i].z])
    74                 {
    75                     sum -= 1;
    76                 }
    77                 if(vis[P[i].x][P[i].y][P[i].z-1])
    78                 {
    79                     sum -= 1;
    80                 }
    81                 if(vis[P[i].x][P[i].y][P[i].z+1])
    82                 {
    83                     sum -= 1;
    84                 }
    85             }
    86             printf("%d
    ", sum);
    87         }
    88     }
    89 
    90 }
    91 
    92 int main()
    93 {
    94     ///freopen("data.in", "r", stdin);
    95     ///freopen("data.out", "w", stdout);
    96     Solve();
    97     return 0;
    98 }
    View Code
  • 相关阅读:
    进程实际操作篇2
    进程的实际操作篇1
    进程的理论知识
    解决套接字粘包,udp套接字对象的使用和socketserver模块实现并发
    day24-网络知识扫盲,socket的基本使用
    day23-网络编程之互联网基础,tcp/ip协议详细介绍
    day21-多态和多态性,鸭子类型,反射,内置方法,异常处理
    JAVA WEB小测
    JAVA动手动脑
    JAVA课上动手动脑问题2
  • 原文地址:https://www.cnblogs.com/Silence-AC/p/3643847.html
Copyright © 2020-2023  润新知