解析: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;
}