题目链接:点击打开链接
题意:一堆体积为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;
}