2017年蓝桥杯省赛 1.九宫幻方 困难 知识点:暴力模拟

103 阅读2分钟

题目:1.九宫幻方 - 蓝桥云课 (lanqiao.cn)

解析:2017-C-C题8九宫幻方_哔哩哔哩_bilibili

这道题说了所有的三阶幻方都是由

   4   9  2
   3   5  7
   8   1  6

进行旋转或镜像之后得到的。

那我们可以把所有的情况全部都模拟出来吗,然后再拿给的样例去比对,如果比对到了就输出,如果匹配到的数量大于1,就输出"many"

上下进行镜像:

   8   1   6
   3   5   7
   4   9   2

左右进行镜像:

   2   9   4
   7   5   3
   6   1   8

向右旋转:

   8   3   4
   1   5   9
   6   7   2

右旋之后进行左右镜像:

  4   3    8
  9   5    1
  2   7    6
  

右旋之后进行上下镜像:

  6   7   2
  1   5   9
  8   3   4

再次右旋:

  6   1   8
  7   5   3
  2   9   4

再次右旋之后再次左右镜像,我们发现与上面一种重复了,不再进行。 再次右旋之后进行上下镜像:我们发现也与上面的一种重复了,不再进行。

再次再次右旋:

  2   7   6
  9   5   1
  4   3   8

再次再次右旋之后进行上下镜像和左右镜像都和上面的有重复,都不再进行。

从原始状态进行左旋,我们发现也是重复的,因此总共的状态就只有这8种。

我们可以写成这样一个二维数组:

	int arr[8][9]={
	{4,9,2,3,5,7,8,1,6},
	{8,1,6,3,5,7,4,9,2},
	{2,9,4,7,5,3,6,1,8},
	{8,3,4,1,5,9,6,7,2},
	{4,3,8,9,5,1,2,7,6},
	{6,7,2,1,5,9,8,3,4},
	{6,1,8,7,5,3,2,9,4},
	{2,7,6,9,5,1,4,3,8}
	};

把输入的样例数组作为一个一维数组去与arr的每一行进行匹配。

#include<bits/stdc++.h>
using namespace std;

	int arr[8][9]={
	{4,9,2,3,5,7,8,1,6},
	{8,1,6,3,5,7,4,9,2},
	{2,9,4,7,5,3,6,1,8},
	{8,3,4,1,5,9,6,7,2},
	{4,3,8,9,5,1,2,7,6},
	{6,7,2,1,5,9,8,3,4},
	{6,1,8,7,5,3,2,9,4},
	{2,7,6,9,5,1,4,3,8}
	};
	
	int check(int a[9])
	{
	int cnt=0,ans=-1;
		for(int i=0;i<8;i++)
		{
			int flag=1;
			for(int j=0;j<9;j++)
			{
				if(a[j]==0)continue;  //九宫格不能出现0
				else
				{
				   if(a[j]!=arr[i][j])
				   {
				   	flag=0;
				    break;
					}	
				    
				} 
			}
			if(flag)
			{
				cnt++;
				ans=i;
			}
		}
		if(cnt==1)return ans;
		else return -1;
	}
int main()
{

	int a[9]={0};
	for(int i=0;i<9;i++)
	scanf("%d",&a[i]);
    
    //匹配
	int k=check(a); 
	if(k==-1)cout<<"TOO Many"<<endl;
	else 
	{
		printf("%d %d %d\n",arr[k][0],arr[k][1],arr[k][2]);
			printf("%d %d %d\n",arr[k][3],arr[k][4],arr[k][5]);
				printf("%d %d %d\n",arr[k][6],arr[k][7],arr[k][8]);
	}
	return 0;
}

image.png