HDU 4397 - Rubik's Cube

 

题目地址: http://acm.hdu.edu.cn/showproblem.php?pid=4397

 

2012年多校 第10场,1008。

 

模拟题。

 

比赛刚开始就开始敲,敲了一个小时敲好了,交上去WA。

 

于是整个比赛就在调试与纠结中度过。 木有心情做其它题了。。。竟然连模拟都过不了。。。

 

期间怪叔叔各种帮查数据和代码,木有错。

 

赛后看了题解,仍然不知道错在神马地方。。。

 

后来突然想到了,我遗漏一个点,魔方转动是三个颜色一起动的,而我只针对其中一种颜色去模拟,各种纠结。。。

 

改了就过了。。。  代码有点搓比。。。

 

#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cmath>
#include<cstring>
#include<queue>
#include<map>
#include<vector>

using namespace std;

int f[10][13],g[10][13];

void init_(){
	int i,j;
	for(i=1;i<=3;i++)
		for(j=1;j<=3;j++)
			f[i][j]=0;
	for(i=1;i<=3;i++)
		for(j=4;j<=6;j++)
			f[i][j]=1;
	for(i=1;i<=3;i++)
		for(j=7;j<=12;j++)
			f[i][j]=0;
	for(i=4;i<=6;i++)
		for(j=1;j<=3;j++)
			f[i][j]=2;
	for(i=4;i<=6;i++)
		for(j=4;j<=6;j++)
			f[i][j]=3;
	for(i=4;i<=6;i++)
		for(j=7;j<=9;j++)
			f[i][j]=4;
	for(i=4;i<=6;i++)
		for(j=10;j<=12;j++)
			f[i][j]=5;
	for(i=7;i<=9;i++)
		for(j=1;j<=3;j++)
			f[i][j]=0;
	for(i=7;i<=9;i++)
		for(j=4;j<=6;j++)
			f[i][j]=6;
	for(i=7;i<=9;i++)
		for(j=7;j<=12;j++)
			f[i][j]=0;
	/*
	for(i=1;i<=9;i++){
		for(j=1;j<=12;j++)
			printf("%d ",f[i][j]);
		printf("\n");
	}
	*/
}

char op[2000];

void fU(){
	int tmp,j,t=3;
	while(t--){
		tmp=g[4][1];
		for(j=1;j<=11;j++)
			g[4][j]=g[4][j+1];
		g[4][12]=tmp;
	}
	t=2;
	while(t--){
		tmp=g[1][4];
		g[1][4]=g[2][4];
		g[2][4]=g[3][4];
		g[3][4]=g[3][5];
		g[3][5]=g[3][6];
		g[3][6]=g[2][6];
		g[2][6]=g[1][6];
		g[1][6]=g[1][5];
		g[1][5]=tmp;
	} 
}
void fu(){
	int t=3;
	while(t--) fU();
}
void fD(){
	int tmp,j,t=3;
	while(t--){
		tmp=g[6][12];
		for(j=12;j>=2;j--)
			g[6][j]=g[6][j-1];
		g[6][1]=tmp;
	}
	t=2;
	while(t--){
		tmp=g[7][4];
		g[7][4]=g[8][4];
		g[8][4]=g[9][4];
		g[9][4]=g[9][5];
		g[9][5]=g[9][6];
		g[9][6]=g[8][6];
		g[8][6]=g[7][6];
		g[7][6]=g[7][5];
		g[7][5]=tmp;
	}
}
void fd(){
	int t=3;
	while(t--) fD();
}
void fR(){
	int tmp,i,t=3;
	while(t--){
		tmp=g[1][6];
		for(i=1;i<=8;i++)
			g[i][6]=g[i+1][6];
		g[9][6]=g[6][10];
		g[6][10]=g[5][10];
		g[5][10]=g[4][10];
		g[4][10]=tmp;
	}
	t=2;
	while(t--){
		tmp=g[4][7];
		g[4][7]=g[5][7];
		g[5][7]=g[6][7];
		g[6][7]=g[6][8];
		g[6][8]=g[6][9];
		g[6][9]=g[5][9];
		g[5][9]=g[4][9];
		g[4][9]=g[4][8];
		g[4][8]=tmp;
	}
}
void fr(){
	int t=3;
	while(t--) fR();
}
void fL(){
	int tmp,i,t=3;
	while(t--){
		tmp=g[9][4];
		for(i=9;i>=2;i--)
			g[i][4]=g[i-1][4];
		g[1][4]=g[4][12];
		g[4][12]=g[5][12];
		g[5][12]=g[6][12];
		g[6][12]=tmp;
	}
	t=2;
	while(t--){
		tmp=g[4][1];
		g[4][1]=g[5][1];
		g[5][1]=g[6][1];
		g[6][1]=g[6][2];
		g[6][2]=g[6][3];
		g[6][3]=g[5][3];
		g[5][3]=g[4][3];
		g[4][3]=g[4][2];
		g[4][2]=tmp;
	}
}
void fl(){
	int t=3;
	while(t--) fL();
}
void ff(){
	int tmp,t=3;
	while(t--){
		tmp=g[3][4];
		g[3][4]=g[3][5];
		g[3][5]=g[3][6];
		g[3][6]=g[4][7];
		g[4][7]=g[5][7];
		g[5][7]=g[6][7];
		g[6][7]=g[7][6];
		g[7][6]=g[7][5];
		g[7][5]=g[7][4];
		g[7][4]=g[6][3];
		g[6][3]=g[5][3];
		g[5][3]=g[4][3];
		g[4][3]=tmp;
	}
	t=2;
	while(t--){
		tmp=g[4][4];
		g[4][4]=g[4][5];
		g[4][5]=g[4][6];
		g[4][6]=g[5][6];
		g[5][6]=g[6][6];
		g[6][6]=g[6][5];
		g[6][5]=g[6][4];
		g[6][4]=g[5][4];
		g[5][4]=tmp;
	}
}
void fF(){
	int t=3;
	while(t--) ff();
}
void fB(){
	int tmp,t=3;
	while(t--){
		tmp=g[1][4];
		g[1][4]=g[1][5];
		g[1][5]=g[1][6];
		g[1][6]=g[4][9];
		g[4][9]=g[5][9];
		g[5][9]=g[6][9];
		g[6][9]=g[9][6];
		g[9][6]=g[9][5];
		g[9][5]=g[9][4];
		g[9][4]=g[6][1];
		g[6][1]=g[5][1];
		g[5][1]=g[4][1];
		g[4][1]=tmp;
	}
	t=2;
	while(t--){
		tmp=g[4][10];
		g[4][10]=g[5][10];
		g[5][10]=g[6][10];
		g[6][10]=g[6][11];
		g[6][11]=g[6][12];
		g[6][12]=g[5][12];
		g[5][12]=g[4][12];
		g[4][12]=g[4][11];
		g[4][11]=tmp;
	}
}
void fb(){
	int t=3;
	while(t--) fB();
}
void fx(){
	int tmp,j,t=3;
	while(t--){
		tmp=g[5][12];
		for(j=12;j>=2;j--)
			g[5][j]=g[5][j-1];
		g[5][1]=tmp;
	}
}
void fX(){
	int tmp,j,t=3;
	while(t--){
		tmp=g[5][1];
		for(j=1;j<=11;j++)
			g[5][j]=g[5][j+1];
		g[5][12]=tmp;	
	}
}
void fY(){
	int tmp,i,t=3;
	while(t--){
		tmp=g[1][5];
		for(i=1;i<=8;i++)
			g[i][5]=g[i+1][5];
		g[9][5]=g[6][11];
		g[6][11]=g[5][11];
		g[5][11]=g[4][11];
		g[4][11]=tmp;
	}
}
void fy(){
	int tmp,i,t=3;
	while(t--){
		tmp=g[9][5];
		for(i=9;i>=2;i--)
			g[i][5]=g[i-1][5];
		g[1][5]=g[4][11];
		g[4][11]=g[5][11];
		g[5][11]=g[6][11];
		g[6][11]=tmp;
	}
}
void fZ(){
	int tmp,t=3;
	while(t--){
		tmp=g[2][4];
		g[2][4]=g[2][5];
		g[2][5]=g[2][6];
		g[2][6]=g[4][8];
		g[4][8]=g[5][8];
		g[5][8]=g[6][8];
		g[6][8]=g[8][6];
		g[8][6]=g[8][5];
		g[8][5]=g[8][4];
		g[8][4]=g[6][2];
		g[6][2]=g[5][2];
		g[5][2]=g[4][2];
		g[4][2]=tmp;
	}
}
void fz(){
	int t=3;
	while(t--) fZ();
}

int res(){
	int i,j;
	for(i=1;i<=3;i++)
		for(j=4;j<=6;j++)
			if(g[i][j]!=g[1][4]) return 0;
	for(i=4;i<=6;i++)
		for(j=1;j<=3;j++)
			if(g[i][j]!=g[4][1]) return 0;
	for(i=4;i<=6;i++)
		for(j=4;j<=6;j++)
			if(g[i][j]!=g[4][4]) return 0;
	for(i=4;i<=6;i++)
		for(j=7;j<=9;j++)
			if(g[i][j]!=g[4][7]) return 0;
	for(i=4;i<=6;i++)
		for(j=10;j<=12;j++)
			if(g[i][j]!=g[4][10]) return 0;
	for(i=7;i<=9;i++)
		for(j=4;j<=6;j++)
			if(g[i][j]!=g[7][4]) return 0;
	return 1;
}

void debug(){
	int i,j;
	int k[9]={0};
	for(i=1;i<=9;i++)
		for(j=1;j<=12;j++)
			k[g[i][j]]++;
	for(i=1;i<=6;i++)
		if(k[i]!=9) while(1);
}

int can(){
	int i,j,k;
	for(i=0;op[i];i++){
		if(op[i]=='U') fU();
		else if(op[i]=='u') fu();
		else if(op[i]=='D') fD();
		else if(op[i]=='d') fd();
		else if(op[i]=='R') fR();
		else if(op[i]=='r') fr();
		else if(op[i]=='L') fL();
		else if(op[i]=='l') fl();
		else if(op[i]=='F') fF();
		else if(op[i]=='f') ff();
		else if(op[i]=='B') fB();
		else if(op[i]=='b') fb();
		else if(op[i]=='X') fX();
		else if(op[i]=='x') fx();
		else if(op[i]=='Y') fY();
		else if(op[i]=='y') fy();
		else if(op[i]=='Z') fZ();
		else if(op[i]=='z') fz();
		else while(1) puts("fuck!");
	}
	/*
	for(i=1;i<=9;i++){
		for(j=1;j<=12;j++)
			printf("%d ",g[i][j]);
		printf("\n");
	}
	
	debug();
	*/
//	return res();

	for(i=1;i<=9;i++)
		for(j=1;j<=12;j++)
			if(f[i][j]!=g[i][j]) return 0;
	return 1;
}

void cpy(){
	int i,j;
	for(i=1;i<=9;i++)
		for(j=1;j<=12;j++)
			g[i][j]=f[i][j];
}

int main(){
	int flag=0;
	init_();
	while(~scanf("%s",op)){
		cpy();
		if(flag!=0) puts("");
		else flag=1;
		if(can()) puts("Yes");
		else puts("No");
	}
	
	return 0;
}

/*
buBubuuBbuBubuuBbuBubuuBbuBubuuBbuBubuuBbuBubuuBuU
ldLdlddLldLdlddLldLdlddLldLdlddLldLdlddLldLdlddL
*/


 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值