hdu 6202 cube cube cube 沈阳区域赛网络赛 (膜拟)

题意:

给一个特殊魔方的颜色图案,问你能不能在三步内还原魔方

如果不懂魔方的转动可以看这个视频

http://www.bilibili.com/video/av8452301/?from=search&seid=11750270100959783079

思路:

emmmm。。。。。

比赛的时候有随机数交过的。。。

模拟魔方转动过程。。。

这可能不太好想

所以拿起身边的草稿纸开始动手做一个魔方吧。。。

hdu 6202 cube cube cube 沈阳区域赛网络赛 (膜拟)_第1张图片

做的不好看。。。。

hdu 6202 cube cube cube 沈阳区域赛网络赛 (膜拟)_第2张图片

不过最后还是把表打出来了

hdu 6202 cube cube cube 沈阳区域赛网络赛 (膜拟)_第3张图片


#include
using namespace std;
int a[73];
bool flag;
const int ans[12][9][3]=
{
    {14,55,36 
    ,41,37,45
    ,43,38,40
    ,42,39,44
     ,5,54,64
     ,6,53,66 
     ,7,49,65 
     ,8,48,69 
     ,9,46,68
    },
    {10,45,59
    ,28,36,32
    ,33,30,35
    ,29,31,34
     ,1,68,27
     ,3,69,26
     ,2,70,22
     ,6,71,21
     ,5,72,19
    },
    {2,52,67
    ,3,51,71
    ,4,47,70
    ,11,58,34
    ,15,57,35
    ,16,56,31
    },
    {28,63,41
    ,10,18,14
    ,11,13,16
    ,15,12,17
     ,1,23,54
     ,3,24,53
     ,4,20,52
     ,8,21,51
     ,9,19,50
    },
    {4,65,25
    ,8,66,24
    ,7,67,20
    ,43,56,13
    ,44,60,12
    ,40,61,11
    },
    {19,54,68
    ,1,9,5
    ,2,4,7
    ,6,3,8
    ,10,41,36
    ,12,42,35
    ,11,43,31
    ,15,44,30
    ,14,45,28
    },
	{32,37,18
	,59,55,63
	,62,60,57
	,61,56,58
	,64,50,27
	,66,51,26
	,67,47,25
	,71,48,24
	,72,46,23 
	},
	{27,46,5
	,72,64,68
	,66,69,71
	,65,70,67
	,59,37,36
	,60,39,35
	,56,40,34
	,57,44,33
	,55,45,32
	},
	{64,23,9
	,46,50,54
	,47,52,49
	,48,51,53
	,55,18,41
	,57,17,42
	,58,16,38
	,62,15,39
	,63,14,37
	},
	{50,72,1
	,23,27,19
	,24,26,21
	,20,25,22
	,63,32,10
	,62,33,12
	,61,29,13
	,60,30,17
	,59,28,18
	},
	{61,38,31
	,62,42,30
	,58,43,29
	,47,7,22
	,48,6,26
	,49,2,25
    },
    {13,38,34
    ,17,39,33
    ,16,40,29
    ,52,65,22
    ,53,69,21
    ,49,70,20
    }

};
void p(int x,int y,int z)
{
    int xx=a[x],yy=a[y],zz=a[z];
    a[x]=zz;
    a[y]=xx;
    a[z]=yy;
}
void jj(int i)
{
        for(int j=0;j<9;j++)
        {
        	if(ans[i][j][0]==0) break;
         p(ans[i][j][0],ans[i][j][1],ans[i][j][2]);    	
        }
       
}
bool judge()
{
    for(int i=0;i<8;i++)
    {
        for(int j=2;j<=9;j++)
            if(a[i*9+1]!=a[i*9+j]) return false;    
    }
    return true;
}
void dfs(int n)
{
    flag=judge();
    if(flag) return;
    if(n==0) return;
    
    for(int i=0;i<12;i++)
    {
        jj(i);
        dfs(n-1);
        if(flag) return;
        jj(i);
        dfs(n-1);
        if(flag) return;
        jj(i);
    }
    
    
}
int main()
{   
 /*for(int i=0;i<12;i++)
 {
  for(int j=0;j<9;j++)
 {
  for(int k=0;k<3;k++)
 printf("%d%c",ans[i][j][k]," \n"[k==2]);	
 }	
 printf("\n\n");
 }
*/

    int t;
    cin>>t;
    while(t--)
    {
        for(int i=1;i<=72;i++)
        cin>>a[i];
        flag=false;
        dfs(3);
        if(flag) printf("YES\n");
        else printf("NO\n");
    }
    return 0;
}
方法太蠢,请见谅。。。。。。



你可能感兴趣的:(模拟,网络赛)