absi2011's Blog & Daily Life.

全新的开始       我要省选翻盘       I wanna AK in 高考\化学       自此,生无可恋
[恢复状态] BZOJ 2002
[恢复状态] HDU 4010 Query on The Trees

[恢复状态] Gym 100851A

absi2011 posted @ Apr 02, 2016 11:09:03 AM in 刷题记录 with tags DFS CF Gym 瞎搞 小高考 , 624 阅读

题意:

给你8个立方体的位置,问能不能折成一个四维的东西

感觉作者脑洞好大..

做法:

我们观察二维的

显然,以下情况是可以的

OOO

  OOO

那么在此情况下,我们可以发现

123

  456

1-3对面;2-5对面;3-6对面

我们只要考虑,x-y对面即可,那么x-y对面的情况经过观察若干种(以下1-4对面,2-5对面,3-6对面)

 1

2356

   4

 

1

23

 45

  6

之类的

可以发现,1在向右以后,上下若干步,再往右的即是1的对立面

同理,1向下以后,向左右若干步是1的对立面

如此,我们就得到算法,向某个方向走一步,之后沿其他方向若干步再沿着这个方向一步即可

那么我们就找到所有的对立面即可..dfs吧

代码:

#include<set>
#include<map>
#include<list>
#include<queue>
#include<stack>
#include<string>
#include<math.h>
#include<time.h>
#include<vector>
#include<bitset>
#include<memory>
#include<utility>
#include<fstream>
#include<stdio.h>
#include<sstream>
#include<iostream>
#include<stdlib.h>
#include<string.h>
#include<algorithm>
using namespace std;
char a[15][15][15];
bool visit[15][15][15];
int paired[15];
void dfs(int x,int y,int z,int t,int k)
{
    if ((x<0)||(y<0)||(z<0)) return;
    if ((x>7)||(y>7)||(z>7)) return;
    if (a[x][y][z]=='.') return;
    if (visit[x][y][z]) return;
    visit[x][y][z]=1;
    if (t==0)
    {
        if ((x+1<8)&&(a[x+1][y][z]!='.'))
        {
            int p=a[x+1][y][z];
            if ((p!=k)&&(p!=paired[k]))
            {
                if (paired[k]!=-1)
                {
                    puts("No");
                    exit(0);
                }
                paired[k]=p;
            }
        }
    }
    else if (t!=1)
    {
        dfs(x+1,y,z,t,k);
    }
    if (t==1)
    {
        if ((x-1>=0)&&(a[x-1][y][z]!='.'))
        {
            int p=a[x-1][y][z];
            if ((p!=k)&&(p!=paired[k]))
            {
                if (paired[k]!=-1)
                {
                    puts("No");
                    exit(0);
                }
                paired[k]=p;
            }
        }
    }
    else if (t!=0)
    {
        dfs(x-1,y,z,t,k);
    }
    if (t==2)
    {
        if ((y+1<8)&&(a[x][y+1][z]!='.'))
        {
            int p=a[x][y+1][z];
            if ((p!=k)&&(p!=paired[k]))
            {
                if (paired[k]!=-1)
                {
                    puts("No");
                    exit(0);
                }
                paired[k]=p;
            }
        }
    }
    else if (t!=3)
    {
        dfs(x,y+1,z,t,k);
    }
    if (t==3)
    {
        if ((y-1>=0)&&(a[x][y-1][z]!='.'))
        {
            int p=a[x][y-1][z];
            if ((p!=k)&&(p!=paired[k]))
            {
                if (paired[k]!=-1)
                {
                    puts("No");
                    exit(0);
                }
                paired[k]=p;
            }
        }
    }
    else if (t!=2)
    {
        dfs(x,y-1,z,t,k);
    }
    if (t==4)
    {
        if ((z+1<8)&&(a[x][y][z+1]!='.'))
        {
            int p=a[x][y][z+1];
            if ((p!=k)&&(p!=paired[k]))
            {
                if (paired[k]!=-1)
                {
                    puts("No");
                    exit(0);
                }
                paired[k]=p;
            }
        }
    }
    else if (t!=5)
    {
        dfs(x,y,z+1,t,k);
    }
    if (t==5)
    {
        if ((z-1>=0)&&(a[x][y][z-1]!='.'))
        {
            int p=a[x][y][z-1];
            if ((p!=k)&&(p!=paired[k]))
            {
                if (paired[k]!=-1)
                {
                    puts("No");
                    exit(0);
                }
                paired[k]=p;
            }
        }
    }
    else if (t!=4)
    {
        dfs(x,y,z-1,t,k);
    }
}
int main()
{
    freopen("hypercube.in","r",stdin);
    freopen("hypercube.out","w",stdout);
    int n,m,k;
    scanf("%d%d%d",&m,&n,&k);
    int i,j,l;
    int sum=0;
    memset(a,'.',sizeof(a));
    memset(paired,-1,sizeof(paired));
    for (i=0;i<k;i++)
    {
        for (j=0;j<n;j++)
        {
            scanf("%s",a[i][j]);
            for (l=0;l<m;l++)
            {
                if (a[i][j][l]=='x')
                {
                    a[i][j][l]=sum++;
                }
            }
            a[i][j][l]='.';
        }
    }
    for (i=0;i<k;i++)
    {
        for (j=0;j<n;j++)
        {
            for (l=0;l<m;l++)
            {
                if (a[i][j][l]!='.')
                {
                    memset(visit,0,sizeof(visit));
                    dfs(i-1,j,l,1,a[i][j][l]);
                    memset(visit,0,sizeof(visit));
                    dfs(i+1,j,l,0,a[i][j][l]);
                    memset(visit,0,sizeof(visit));
                    dfs(i,j-1,l,3,a[i][j][l]);
                    memset(visit,0,sizeof(visit));
                    dfs(i,j+1,l,2,a[i][j][l]);
                    memset(visit,0,sizeof(visit));
                    dfs(i,j,l-1,5,a[i][j][l]);
                    memset(visit,0,sizeof(visit));
                    dfs(i,j,l+1,4,a[i][j][l]);
                }
            }
        }
    }
    for (i=0;i<8;i++)
    {
        if (paired[paired[i]]!=i)
        {
            puts("No");
            return 0;
        }
    }
    puts("Yes");
    return 0;
}

登录 *


loading captcha image...
(输入验证码)
or Ctrl+Enter