当前位置: 首页 > 工具软件 > Polycube > 使用案例 >

hdu 2762 Area of polycube

涂玉韵
2023-12-01

题目链接:点击打开链接


题意:一堆体积为1的立方体,把他们摞起来,给出摞的方法,问是不是每两个立方体间至少有一个面相连,如果是输出表面积。


模拟,每次相当于输入x,y,z,查x+1 , y ,z ;  x-1 , y , z;  x , y+1 , z;   x ,y-1 , z ;   x ,y z+1;   x , y , z-1六个位置(小于0的就不查了),

面积的变化为res-2*num+6;


坑:会有重复的输入要输出NO!wa好几次


代码:

#include <iostream>
#include <cstdio>
#include <cstring>
using namespace std;
bool vis[305][305][305];
int res;

bool input(char *t){
    int a[4];
    int k=0;
    for(int i=1;i<=3;i++){
        a[i]=*(t+k)-'0';
        k+=2;
    }
    int num=0;
    if(vis[a[1]][a[2]][a[3]]) return 0;
    if(vis[a[1]][a[2]][a[3]+1]) num++;
    if(vis[a[1]][a[2]+1][a[3]]) num++;
    if(vis[a[1]+1][a[2]][a[3]]) num++;
    if(a[1]>0&&vis[a[1]-1][a[2]][a[3]]) num++;
    if(a[2]>0&&vis[a[1]][a[2]-1][a[3]]) num++;
    if(a[3]>0&&vis[a[1]][a[2]][a[3]-1]) num++;
    if(num==0) return 0;
    vis[a[1]][a[2]][a[3]]=1;
    res=res-num+6-num;
    return 1;
}


int main(){
    int T;
    int cas=1;
    cin>>T;
    while(T--){
        memset(vis,0,sizeof(vis));
        res=6;
        vis[0][0][0]=1;
        int p;
        cin>>p;
        int bug=0;
        bool flag=0;
        for(int i=1;i<=p;i++){
            char t[10];
            scanf("%s",t);
            if(i==1) continue;
            if(!flag){
               if(!input(t)){
                    bug=i;
                    flag=1;
               }
            }
        }

        cout<<cas++<<" ";
        if(flag)cout<<"NO"<<" "<<bug<<endl;
        else cout<<res<<endl;
    }
    return 0;
}





 类似资料:

相关阅读

相关文章

相关问答