Gym - 101257A The Fault in Our Cubes【DFS】

题目链接:https://vjudge.net/problem/Gym-101257A
题意:给你一条长度为27的字符串,字符有三种类型,即方块有三种类型,问你能不能拼成3x3x3的正方形
解析:大胆暴力,把第一个E放好,I的方向是确定的,L的方向是除了上一个和直着的那个不能放意外,都找一下
我的代码真的是又丑又长(:

#include <algorithm>
#include <cstdio>
#include <cstring>
#include <iostream>
#include <queue>
using namespace std;
const int maxn = 2*1e5+100;
char a[maxn];
int vis[30][30][30];
int dx[] = {0,1,-1,0,0,0};
int dy[] = {1,0,0,-1,0,0};
int dz[] = {0,0,0,0,1,-1};
/*dir:
0 左 1 前
2 后 3 右
4 上 5 下*/
bool dfs(int cnt,int x,int y,int z,int dir)
{
    int tx = x+dx[dir];
    int ty = y+dy[dir];
    int tz = z+dz[dir];
    if(tx<0 || tx>2 || ty<0 || ty>2 || tz<0 || tz>2)
        return false;
    if(vis[tx][ty][tz])
        return false;
    if(cnt==26)
        return true;
    if(a[cnt]=='I')
    {
        vis[tx][ty][tz] = 1;
        if(dfs(cnt+1,tx,ty,tz,dir))
            return true;
    }
    else
    {
        vis[tx][ty][tz] = 1;
        for(int i=0;i<6;i++)
        {
            if(dir==i)
                continue;
            if(dfs(cnt+1,tx,ty,tz,i))
                return true;
        }
    }
    vis[tx][ty][tz] = 0;
    return false;
}
int main(void)
{
    scanf("%s",a);
    int flag = 0;
    for(int i=0;i<27;i++)
    {
        if(a[i]=='E')
            flag++;
    }
    if(flag>2)
        puts("NO");
    else
    {
        memset(vis,0,sizeof(vis));
        bool ans = false;
        for(int i=0;i<3;i++)
        {
            for(int k=0;k<3;k++)
            {
                for(int j=0;j<6;j++)
                {
                    vis[i][0][k] = 1;
                    ans = dfs(1,i,0,k,j);
                    if(ans)
                    {
                        puts("YES");
                        break;
                    }
                    else
                        vis[i][0][k] = 0;
                }
                if(ans)
                    break;
            }
            if(ans)
                break;
        }
        if(!ans)
            puts("NO");
    }
    return 0;
}
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值