题意:给出n个3d坐标,每一个坐标代表一个小立方体,问能否成为一个大的连续的多面体,
要求:1,坐标不能和前面的相同。2.,每一个点必须更前面的相连,第一个除外。
思路:这里的立方体个数不多,暴搜就行了。每次碰到边界表面积加1.
#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <cmath>
#include <queue>
using namespace std;
int dp[209][209][209];
int re[109][3];
int cnt,ans;
int dx[]={0,0,0,0,-1,1};
int dy[]={-1,1,0,0,0,0};
int dz[]={0,0,-1,1,0,0};
void dfs(int x,int y,int z)
{
if(dp[x][y][z]==0)
{
ans++;
return ;
}
if(dp[x][y][z]!=1) return ;
dp[x][y][z] = 2;cnt++;
for(int i=0;i<6;i++)
{
int tx=x+dx[i],ty=y+dy[i],tz=z+dz[i];
dfs(tx,ty,tz);
}
}
int main()
{
// freopen("in.txt","r",stdin);
int cas,T=1,n;
scanf("%d",&cas);
while(cas--)
{
scanf("%d",&n);
memset(dp,0,sizeof(dp));
int fig = -1;
for(int i=0;i<n;i++)
{
scanf("%d,%d,%d",&re[i][0],&re[i][1],&re[i][2]);
re[i][0]+=105;re[i][1]+=105;re[i][2]+=105;
int j;
for(j=0;j<6;j++)
{
if(dp[re[i][0]+dx[j]][re[i][1]+dy[j]][re[i][2]+dz[j]]) break;
}
if((i&&j>=6&&fig==-1)||dp[re[i][0]][re[i][1]][re[i][2]])
{
fig = i;
}
dp[re[i][0]][re[i][1]][re[i][2]] = 1;
}cnt=0;ans=0;
if(fig>0)
{
printf("%d NO %d\n",T++,fig+1);
continue;
}
dfs(re[0][0],re[0][1],re[0][2]);
printf("%d %d\n",T++,ans);
}
return 0;
}