题目链接: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;
}