NC21683. Rubik's Cube
描述
小w一直在陪tokitsukaze玩星际,有一天他玩累了,他想找一些能够放松自己的事情做,比如玩玩魔方。这不是,小w就买了一个三阶魔方玩。(三阶魔方是3x3x3的标准魔方)
魔方的每一个面可以看成是一个九宫格。
因为小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; }