列表

详情


NC21683. Rubik's Cube

描述

小w一直在陪tokitsukaze玩星际,有一天他玩累了,他想找一些能够放松自己的事情做,比如玩玩魔方。这不是,小w就买了一个三阶魔方玩。(三阶魔方是3x3x3的标准魔方)

众所周知NIT集训队中有很多玩魔方的大佬,比如说doge和water,但是小w就不会玩魔方。小w买来一个数字魔方想要练习玩魔方的技巧。

魔方的每一个面可以看成是一个九宫格。

九宫格中每个位置都有一个0-9的数字。

因为小w不会玩魔方,所以他只能拼出一面。经过练习,他现在能够拼出一面中数字的和最大。

doge看到了他这么玩魔方,就想要考考他。

doge提出了m个问题,问小w能不能拼出某一面,使得这一面九宫格的数字之和等于某一个值。

如果小w能够做到的话请输出"Yes"否则请输出"No"(不含引号)。

输入描述

第一行输入一个是一个正整数T(T≤10000),表示有T组数据。

对于每组数据:
输入一个9行12列的字符型矩阵。

矩阵表示魔方的平面展开图,展开图的格式固定。

输入格式为:

***xxx******
***xxx******
***xxx******
xxxxxxxxxxxx
xxxxxxxxxxxx
xxxxxxxxxxxx
***xxx******
***xxx******
***xxx******

表示一个魔方的平面展开图。

即:


"x"在输入的数据中是一个0-9的数字。并且对于每组数据,仅有"x"所代表的数字不同。

接下来输入一个正整数m(m≤100)表示有m组查询。

然后m行,每行一个整数queryx(0≤queryx≤81),表示doge要求小w在魔方的某一面上拼出的数字和。

输出描述

对于每一个查询,输出"Yes"或者"No"表示小w能否做到doge的要求。

示例1

输入:

2
***092******
***305******
***569******
782902090790
902347865291
030076932400
***900******
***069******
***706******
1
81
***123******
***450******
***327******
348173240231
421796000020
010980013040
***236******
***042******
***102******
3
67
66
65

输出:

Yes
Yes
No
Yes

原站题解

上次编辑到这里,代码来自缓存 点击恢复默认模板

C++11(clang++ 3.9) 解法, 执行用时: 400ms, 内存消耗: 3424K, 提交时间: 2019-01-09 19:37:53

#include<stdio.h>
int main()
{
	int i,j,k,l,x,y,z,w,t,n,r;
	char a[8][3],b[12][2],c[6];
	int d[8][3],e[12][2],f[6];
	int sa[37]={0},sb[37]={0},s[82]={0};
	scanf("%d",&t);
	for(t=t;t>0;t--){
		for(i=0;i<37;i++)
		sa[i]=sb[i]=0;
		for(i=0;i<82;i++)
		s[i]=0;
		getchar();
		scanf("***%c%c%c****** ",&a[0][0],&b[0][0],&a[1][0]);
		scanf("***%c%c%c****** ",&b[1][0],&c[0],&b[2][0]);
		scanf("***%c%c%c****** ",&a[2][0],&b[3][0],&a[3][0]);
		scanf("%c%c%c%c%c%c%c%c%c%c%c%c ",&a[0][1],&b[1][1],&a[2][1],&a[2][2],&b[3][1],\
		&a[3][1],&a[3][2],&b[2][1],&a[1][1],&a[1][2],&b[0][1],&a[0][2]);
		scanf("%c%c%c%c%c%c%c%c%c%c%c%c ",&b[4][0],&c[1],&b[5][0],&b[5][1],&c[2],\
		&b[6][0],&b[6][1],&c[3],&b[7][0],&b[7][1],&c[4],&b[4][1]);
		scanf("%c%c%c%c%c%c%c%c%c%c%c%c ",&a[4][0],&b[8][0],&a[5][0],&a[5][1],&b[9][0],\
		&a[6][0],&a[6][1],&b[10][0],&a[7][0],&a[7][1],&b[11][0],&a[4][1]);
		scanf("***%c%c%c****** ",&a[5][2],&b[9][1],&a[6][2]);
		scanf("***%c%c%c****** ",&b[8][1],&c[5],&b[10][1]);
		scanf("***%c%c%c****** ",&a[4][2],&b[11][1],&a[7][2]);
		for(i=0;i<8;i++){
			for(j=0;j<3;j++){
				d[i][j]=a[i][j]-'0';
			}
		}
		for(i=0;i<12;i++){
			for(j=0;j<2;j++){
				e[i][j]=b[i][j]-'0';
			}
		}
		for(i=0;i<6;i++){
			f[i]=c[i]-'0';
		}
		for(i=0;i<=4;i++){
			for(j=i+1;j<=5;j++){
				for(k=j+1;k<=6;k++){
					for(l=k+1;l<=7;l++){
						for(x=0;x<3;x++){
							for(y=0;y<3;y++){
								for(z=0;z<3;z++){
									for(w=0;w<3;w++){
										sa[d[i][x]+d[j][y]+d[k][z]+d[l][w]]=1;
									}
								}
							}
						}
					}
				}
			}
		}
		for(i=0;i<=8;i++){
			for(j=i+1;j<=9;j++){
				for(k=j+1;k<=10;k++){
					for(l=k+1;l<=11;l++){
						for(x=0;x<2;x++){
							for(y=0;y<2;y++){
								for(z=0;z<2;z++){
									for(w=0;w<2;w++){
										sb[e[i][x]+e[j][y]+e[k][z]+e[l][w]]=1;
									}
								}
							}
						}
					}
				}
			}
		}
		for(i=0;i<6;i++){
			for(j=0;j<37;j++){
				for(k=0;k<37;k++){
					if(sa[j]&&sb[k])
					s[j+k+f[i]]=1;
				}
			}
		}
		scanf("%d",&n);
		for(n=n;n>0;n--){
			scanf("%d",&r);
			if(s[r])printf("Yes\n");
			else printf("No\n");
		}
	}
	return 0;
}

C++14(g++5.4) 解法, 执行用时: 471ms, 内存消耗: 3380K, 提交时间: 2019-03-04 20:50:08

#include<stdio.h>
int main()
{
int i,j,k,l,x,y,z,w,t,n,r;
char a[8][3],b[12][2],c[6];
int d[8][3],e[12][2],f[6];
int sa[37]={0},sb[37]={0},s[82]={0};
scanf("%d",&t);
for(t=t;t>0;t--){
for(i=0;i<37;i++)
sa[i]=sb[i]=0;
for(i=0;i<82;i++)
s[i]=0;
getchar();
scanf("***%c%c%c****** ",&a[0][0],&b[0][0],&a[1][0]);
scanf("***%c%c%c****** ",&b[1][0],&c[0],&b[2][0]);
scanf("***%c%c%c****** ",&a[2][0],&b[3][0],&a[3][0]);
scanf("%c%c%c%c%c%c%c%c%c%c%c%c ",&a[0][1],&b[1][1],&a[2][1],&a[2][2],&b[3][1],\
&a[3][1],&a[3][2],&b[2][1],&a[1][1],&a[1][2],&b[0][1],&a[0][2]);
scanf("%c%c%c%c%c%c%c%c%c%c%c%c ",&b[4][0],&c[1],&b[5][0],&b[5][1],&c[2],\
&b[6][0],&b[6][1],&c[3],&b[7][0],&b[7][1],&c[4],&b[4][1]);
scanf("%c%c%c%c%c%c%c%c%c%c%c%c ",&a[4][0],&b[8][0],&a[5][0],&a[5][1],&b[9][0],\
&a[6][0],&a[6][1],&b[10][0],&a[7][0],&a[7][1],&b[11][0],&a[4][1]);
scanf("***%c%c%c****** ",&a[5][2],&b[9][1],&a[6][2]);
scanf("***%c%c%c****** ",&b[8][1],&c[5],&b[10][1]);
scanf("***%c%c%c****** ",&a[4][2],&b[11][1],&a[7][2]);
for(i=0;i<8;i++){
for(j=0;j<3;j++){
d[i][j]=a[i][j]-'0';
}
}
for(i=0;i<12;i++){
for(j=0;j<2;j++){
e[i][j]=b[i][j]-'0';
}
}
for(i=0;i<6;i++){
f[i]=c[i]-'0';
}
for(i=0;i<=4;i++){
for(j=i+1;j<=5;j++){
for(k=j+1;k<=6;k++){
for(l=k+1;l<=7;l++){
for(x=0;x<3;x++){
for(y=0;y<3;y++){
for(z=0;z<3;z++){
for(w=0;w<3;w++){
sa[d[i][x]+d[j][y]+d[k][z]+d[l][w]]=1;
}
}
}
}
}
}
}
}
for(i=0;i<=8;i++){
for(j=i+1;j<=9;j++){
for(k=j+1;k<=10;k++){
for(l=k+1;l<=11;l++){
for(x=0;x<2;x++){
for(y=0;y<2;y++){
for(z=0;z<2;z++){
for(w=0;w<2;w++){
sb[e[i][x]+e[j][y]+e[k][z]+e[l][w]]=1;
}
}
}
}
}
}
}
}
for(i=0;i<6;i++){
for(j=0;j<37;j++){
for(k=0;k<37;k++){
if(sa[j]&&sb[k])
s[j+k+f[i]]=1;
}
}
}
scanf("%d",&n);
for(n=n;n>0;n--){
scanf("%d",&r);
if(s[r])printf("Yes\n");
else printf("No\n");
}
}
return 0;
}

上一题