1 条题解

  • 0
    @ 2025-5-4 9:42:29

    仔细想一想,魔方一共有6个面,转每个面可以看成是转一个面,首先就要把每个面表示出来,用指针,在函数中可以改每个面的数。 分别把每个面当成正面,上下左右重新弄一下,然后进入顺时针或者逆时针的函数。由于指定一个面是正面,其他的面不是简单的平移关系,这时候就要把正面周围的面找出来,luckily,我们只要找和正面周围的一行或一列就行,所以找其他的面时,只要改变与正面有关系的地方就行了完事之后就变回来

    
    #include<iostream>
    #include<cstdio>
    using namespace std;
    char sa[10][10],sb[10][10],sc[10][10];
     
    void change0( char (*to)[5], char (*bo)[5] )
    {
    	for (int i = 1; i <= 3; i++)
    	  for (int j = 1; j <= 3; j++)
    	  {
    	    sa[i][j] = to[i][j];  
    	    sb[i][j] = bo[i][j];
    	  }
    	  
    	for (int i = 1; i <= 3; i++) 
    	 {
    	 	to[3][i] = sa[i][1];
    	 	bo[1][i] = sb[4-i][1];
    	 }
    	return;
    }
     
    void dischange0( char (*to)[5], char (*bo)[5] )
    {
    	for (int i = 1; i <= 3; i++)
    	{
    		sa[i][1] = to[3][i];
    		sb[i][1] = bo[1][4-i];
    	}
    	for (int i = 1; i <= 3; i++)
    	  for (int j = 1; j <= 3; j++)
    	  {
    	    to[i][j] = sa[i][j];  
    	    bo[i][j] = sb[i][j];
    	  }	
    	  return;
    }
     
    void change2( char (*to)[5], char (*bo)[5] )
    {
    	for (int i = 1; i <= 3; i++)
    	  for (int j = 1; j <= 3; j++)
    	  {
    	    sa[i][j] = to[i][j];  
    	    sb[i][j] = bo[i][j];
    	  }
    	  
    	for (int i = 1; i <= 3; i++) 
    	 {
    	 	to[3][i] = sa[4-i][3];
    	 	bo[1][i] = sb[i][3];
    	 }
    	return;
    }
     
    void dischange2( char (*to)[5], char (*bo)[5] )
    {
    	for (int i = 1; i <= 3; i++)
    	{
    		sa[i][3] = to[3][4-i];
    		sb[i][3] = bo[1][i];
    	}
    	for (int i = 1; i <= 3; i++)
    	  for (int j = 1; j <= 3; j++)
    	  {
    	    to[i][j] = sa[i][j];  
    	    bo[i][j] = sb[i][j];
    	  }	
    	  return;
    }
     
    void change3( char (*to)[5], char (*bo)[5] )
    {
    	for (int i = 1; i <= 3; i++)
    	  for (int j = 1; j <= 3; j++)
    	  {
    	    sa[i][j] = to[i][j];  
    	    sb[i][j] = bo[i][j];
    	  }
    	  
    	for (int i = 1; i <= 3; i++) 
    	 {
    	 	to[3][i] = sa[1][4-i];
    	 	bo[1][i] = sb[3][4-i];
    	 }
    	return;
    }
     
    void dischange3( char (*to)[5], char (*bo)[5] )
    {
    	for (int i = 1; i <= 3; i++)
    	{
    		sa[1][i] = to[3][4-i];
    		sb[3][i] = bo[1][4-i];
    	}
    	for (int i = 1; i <= 3; i++)
    	  for (int j = 1; j <= 3; j++)
    	  {
    	    to[i][j] = sa[i][j];  
    	    bo[i][j] = sb[i][j];
    	  }	
    	  return;
    }
     
    void change4(char (*le)[5], char (*ri)[5], char (*ba)[5])
    {
    	for (int i = 1; i <= 3; i++)
    	  for (int j = 1; j <= 3; j++)
    	  {
    	  	sa[i][j] = le[i][j];
    	  	sb[i][j] = ri[i][j];
    	  	sc[i][j] = ba[i][j];
    	  }
    	for (int i = 1; i <= 3; i++)
    	{
    		le[i][3] = sa[1][i];
    		ri[i][1] = sb[1][4-i];
    		ba[3][i] = sc[1][4-i];
    	  }  
    	  
      return;	  
    }
     
    void dischange4(char (*le)[5], char (*ri)[5], char (*ba)[5])
    {
       for (int i = 1; i <= 3; i++)
       {
       	sa[1][i] = le[i][3];
    	sb[1][i] = ri[4-i][1]; 
    	sc[1][i] = ba[3][4-i];   
    	}	
    	
    	for (int i = 1; i <= 3; i++)
    	for (int j = 1; j <= 3; j++)
    	{
    		le[i][j] = sa[i][j];
    		ba[i][j] = sc[i][j];	
    		ri[i][j] = sb[i][j];
    	}
    	return;		
    }
     
    void change5(char (*le)[5], char (*ri)[5], char (*ba)[5])
    {
    	for (int i = 1; i <= 3; i++)
    	  for (int j = 1; j <= 3; j++)
    	  {
    	  	sa[i][j] = le[i][j];
    	  	sb[i][j] = ri[i][j];
    	  	sc[i][j] = ba[i][j];
    	  }
    	for (int i = 1; i <= 3; i++)
    	{
    		le[i][3] = sa[3][4-i];
    		ri[i][1] = sb[3][i];
    		ba[1][i] = sc[3][4-i];
    	  }  
    	  
      return;	  
    }
     
    void dischange5(char (*le)[5], char (*ri)[5], char (*ba)[5])
    {
       for (int i = 1; i <= 3; i++)
       {
       	sa[3][i] = le[4-i][3];
    	sb[3][i] = ri[i][1];
    	sc[3][i] = ba[1][4-i];    
    	}	
    	
    	for (int i = 1; i <= 3; i++)
    	for (int j = 1; j <= 3; j++)
    	{
    		le[i][j] = sa[i][j];
    		ri[i][j] = sb[i][j];
    		ba[i][j] = sc[i][j];
    	}
    	return;		
    }
     
     
     
    void clockwise(char (*fr)[5],char (*le)[5], char (*ri)[5], char (*to)[5], char (*bo)[5])
    {
    	char s[10][10];
    	for (int i = 1; i <= 3; i++)
    	  for (int j = 1; j <= 3; j++)
    	    s[i][j] = fr[i][j];
    	
    	for (int i = 1; i <= 3; i++)
    	  for (int j = 1; j <= 3; j++)
    	    fr[j][4-i] = s[i][j];
    	
    	char x,y,z;
    	x = le[1][3];
    	y = le[2][3];
    	z = le[3][3];
    	for (int i = 1; i <= 3; i++)
    		le[i][3] = bo[1][i];
    	for (int i = 1; i <= 3; i++)	
    		bo[1][i] = ri[4-i][1];
    	for (int i = 1; i <= 3; i++)	
    		ri[i][1] = to[3][i];
    	to[3][1] = z;
    	to[3][2] = y;
    	to[3][3] = x;
     
    	return;
    }
     
    void counterclockwise(char (*fr)[5],char (*le)[5], char (*ri)[5], char (*to)[5], char (*bo)[5])
    {
    	
    	char s[10][10];
    	for (int i = 1; i <= 3; i++)
    	  for (int j = 1; j <= 3; j++)
    	    s[i][j] = fr[i][j];
    	
    	for (int i = 1; i <= 3; i++)
    	  for (int j = 1; j <= 3; j++)
    	    fr[4-j][i] = s[i][j];
    	
    	char x,y,z;
    	x = le[1][3];
    	y = le[2][3];
    	z = le[3][3];
    	for (int i = 1; i <= 3; i++)
    		le[i][3] = to[3][4-i];
    	for (int i = 1; i <= 3; i++)	
    		to[3][i] = ri[i][1];
    	for (int i = 1; i <= 3; i++)	
    		ri[i][1] = bo[1][4-i];
    	bo[1][1] = x;
    	bo[1][2] = y;
    	bo[1][3] = z;
    	
    	
    	return;
    }
     
    int main()
    {
    	char fr[10][5],ba[10][5],le[10][5],ri[10][5],to[10][5],bo[10][5];
    	char map[100][100];
    	int n,m,t,k,x,y;
    //freopen("yu.in","r",stdin);	
    //freopen("yu.out","w",stdout);
    	
    	scanf("%d",&t);
    	k = 0;
    	while(t--)
    	{
    		for (int i = 0; i <= 9; i++)
    		cin.getline(map[i],100);
    		
    				
    		for (int i = 1; i <= 3; i++)
    		  for (int j = 1; j <= 3; j++)
    		  {
    		  	to[i][j] = map[i][2*j+4];
    		  	le[i][j] = map[3+i][2*j-2];
    		  	fr[i][j] = map[3+i][4+j*2];
    		  	ri[i][j] = map[3+i][10+2*j];
    		  	ba[i][j] = map[3+i][16+2*j];
    		  	bo[i][j] = map[6+i][4+j*2];
    		  }
    		  
    		scanf("%d",&n);
    		for (int i = 1; i <= n; i++)
    		{
    			scanf("%d%d",&x,&y);
    			switch (x)
    			{
    				case 0 : change0(to,bo); if (y == 1) clockwise(le,ba,fr,to,bo); else 
    				  counterclockwise(le,ba,fr,to,bo); dischange0(to,bo); break;
    				case 1 : if (y == 1) clockwise(fr,le,ri,to,bo); else
    				  counterclockwise(fr,le,ri,to,bo); break;
    				case 2 : change2(to,bo);if (y == 1) clockwise(ri,fr,ba,to,bo); else
    				  counterclockwise(ri,fr,ba,to,bo); dischange2(to,bo); break;
    				case 3 : change3(to,bo);if (y == 1) clockwise(ba,ri,le,to,bo); else
    				  counterclockwise(ba,ri,le,to,bo); dischange3(to,bo); break;  
    				case 4 : change4(le,ri,ba);if (y == 1) clockwise(to,le,ri,ba,fr); else
    				  counterclockwise(to,le,ri,ba,fr); dischange4(le,ri,ba); break;
    				case 5 : change5(le,ri,ba);if (y == 1) clockwise(bo,le,ri,fr,ba); else
    				  counterclockwise(bo,le,ri,fr,ba); dischange5(le,ri,ba); break;     
    			}
    		}
    		k++;
    		printf("Scenario #%d:\n",k);
    		for (int i = 1; i <= 3; i++)
    			printf("      %c %c %c\n",to[i][1],to[i][2],to[i][3]);
    		for (int i = 1; i <= 3; i++)
    			printf("%c %c %c %c %c %c %c %c %c %c %c %c\n",le[i][1],le[i][2],le[i][3],fr[i][1],fr[i][2],fr[i][3],ri[i][1],ri[i][2],ri[i][3],ba[i][1],ba[i][2],ba[i][3]);  
    		for (int i = 1; i <= 3; i++)
    		    printf("      %c %c %c\n",bo[i][1],bo[i][2],bo[i][3]);  
    		printf("\n");
    	}
    		
    	return 0;
     }
    
    
    • 1

    信息

    ID
    956
    时间
    1000ms
    内存
    256MiB
    难度
    10
    标签
    递交数
    1
    已通过
    1
    上传者