| ||||||||||
| Online Judge | Problem Set | Authors | Online Contests | User | ||||||
|---|---|---|---|---|---|---|---|---|---|---|
| Web Board Home Page F.A.Qs Statistical Charts | Current Contest Past Contests Scheduled Contests Award Contest | |||||||||
判断可行的规则主要有两条:是否是一个整体(DFS),能否将该遮蔽的地方都遮蔽住,附AC代码# include <stdio.h>
# include <stdbool.h>
bool data[21][21][21];
bool used[21][21][21];
bool face1[9][21][21],face2[9][21][21],face3[9][21][21];
int n;
void test()
{
int i,j,k;
printf("face1\n");
for(k=1;k<=8;k++)
{
printf("num=%d\n",k);
for(i=1;i<=n;i++)
{
for(j=1;j<=n;j++)
if(face1[k][i][j]) printf("●");
else printf(" ");
printf("\n");
}
printf("\n");
}
printf("face2\n");
for(k=1;k<=8;k++)
{
printf("num=%d\n",k);
for(i=1;i<=n;i++)
{
for(j=1;j<=n;j++)
if(face2[k][i][j]) printf("●");
else printf(" ");
printf("\n");
}
printf("\n");
}
printf("face3\n");
for(k=1;k<=8;k++)
{
printf("num=%d\n",k);
for(i=1;i<=n;i++)
{
for(j=1;j<=n;j++)
if(face3[k][i][j]) printf("●");
else printf(" ");
printf("\n");
}
printf("\n");
}
}
void dfs(int x,int y,int z)
{
if(x<1||x>n||y<1||y>n||z<1||z>n) return;
else if(used[x][y][z]) return;
else if(!data[x][y][z]) return;
else
{
used[x][y][z]=1;
dfs(x+1,y,z);
dfs(x-1,y,z);
dfs(x,y+1,z);
dfs(x,y-1,z);
dfs(x,y,z+1);
dfs(x,y,z-1);
}
}
void makeface()
{
int i,j,k;
for(k=2;k<=4;k++)
for(i=1;i<=n;i++)
for(j=1;j<=n;j++)
{
face1[k][j][n-i+1]=face1[k-1][i][j];
face2[k][j][n-i+1]=face2[k-1][i][j];
face3[k][j][n-i+1]=face3[k-1][i][j];
}
for(k=1;k<=4;k++)
for(i=1;i<=n;i++)
for(j=1;j<=n;j++)
{
face1[k+4][n-i+1][j]=face1[k][i][j];
face2[k+4][n-i+1][j]=face2[k][i][j];
face3[k+4][n-i+1][j]=face3[k][i][j];
}
}
void makeblock(int c1,int c2,int c3)
{
int i,j,k;
for(i=1;i<=n;i++)
for(j=1;j<=n;j++)
if(!face1[c1][i][j])
for(k=1;k<=n;k++)
data[i][j][k]=0;
for(i=1;i<=n;i++)
for(j=1;j<=n;j++)
if(!face2[c2][i][j])
for(k=1;k<=n;k++)
data[k][i][j]=0;
for(i=1;i<=n;i++)
for(j=1;j<=n;j++)
if(!face3[c3][i][j])
for(k=1;k<=n;k++)
data[i][k][j]=0;
}
bool chkthrouth(int c1,int c2,int c3)
{
int i,j,k;
for(i=1;i<=n;i++)
for(j=1;j<=n;j++)
if(face1[c1][i][j])
{
bool flag=0;
for(k=1;k<=n;k++)
if(data[i][j][k]) {flag=1;break;}
if(!flag) return 0;
}
for(i=1;i<=n;i++)
for(j=1;j<=n;j++)
if(face2[c2][i][j])
{
bool flag=0;
for(k=1;k<=n;k++)
if(data[k][i][j]) {flag=1;break;}
if(!flag) return 0;
}
for(i=1;i<=n;i++)
for(j=1;j<=n;j++)
if(face3[c3][i][j])
{
bool flag=0;
for(k=1;k<=n;k++)
if(data[i][k][j]) {flag=1;break;}
if(!flag) return 0;
}
return 1;
}
bool sub_jud()
{
int x,y,z;
memset(used,0,sizeof(used));
for(x=1;x<=n;x++)
for(y=1;y<=n;y++)
{
if(!used[x][y][1]&&data[x][y][1])
{dfs(x,y,1);goto here;}
}
here:;
for(x=1;x<=n;x++)
for(y=1;y<=n;y++)
for(z=1;z<=n;z++)
if(!used[x][y][z]&&data[x][y][z]) return 0;
return 1;
}
bool jud()
{
makeface();
int i,j,k;
for(i=1;i<=8;i++)
for(j=1;j<=8;j++)
for(k=1;k<=8;k++)
{
memset(data,1,sizeof(data));
makeblock(i,j,k);
if(chkthrouth(i,j,k)&&sub_jud()) return 1;
}
return 0;
}
int main()
{
int count=0;
while(1)
{
scanf("%d",&n);
if(!n) break;
int i,j;
for(i=1;i<=n;i++)
{
getchar();
for(j=1;j<=n;j++)
{
char temp;
scanf("%c",&temp);
if(temp=='X') face1[1][j][i]=1;
else face1[1][j][i]=0;
}
}
for(i=1;i<=n;i++)
{
getchar();
for(j=1;j<=n;j++)
{
char temp;
scanf("%c",&temp);
if(temp=='X') face2[1][j][i]=1;
else face2[1][j][i]=0;
}
}
for(i=1;i<=n;i++)
{
getchar();
for(j=1;j<=n;j++)
{
char temp;
scanf("%c",&temp);
if(temp=='X') face3[1][j][i]=1;
else face3[1][j][i]=0;
}
}
if(jud()) printf("Data set %d: Valid set of patterns\n",++count);
else printf("Data set %d: Impossible combination\n",++count);
}
return 0;
}
Followed by:
Post your reply here: |
All Rights Reserved 2003-2013 Ying Fuchen,Xu Pengcheng,Xie Di
Any problem, Please Contact Administrator