原题链接:蓝桥杯2017年第八届真题-九宫幻方
知道上图进行若干镜像和旋转操作之后,一共可以形成8种答案,这道题就好解许多
#include<iostream>
using namespace std;
int arr[9];
//所有情况
int all[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,4,9,2},//再右旋
{2,7,6,9,5,1,4,3,8},//再右旋
};
int test(int arr[])
{
int cnt = 0, pos = -1;//cnt计数,pos纪录当仅能还原出一组可行的三阶幻方时,在all[][]数组中的行下标
for (int i = 0; i < 8; i++) {
bool OK = true;
for (int j = 0; j < 9; j++) {
if (arr[j] == 0) continue;//遇到0时跳过
if (arr[j] != all[i][j]) {//与all[][]第i行不匹配时,跳到下一行继续判定
OK = false;
break;
}
}
if (OK) {//如果匹配,个数+1,记录行下标
cnt++;
pos = i;
}
}
if (cnt == 1)//只有一个匹配
return pos;
else
return -1;
}
int main()
{
for (int i = 0; i < 9; i++)
cin >> arr[i];
int index = test(arr);
if (index == -1)
cout << "Too Many" << endl;
else {
cout << all[index][0] << " " << all[index][1] << " " << all[index][2] << endl;
cout << all[index][3] << " " << all[index][4] << " " << all[index][5] << endl;
cout << all[index][6] << " " << all[index][7] << " " << all[index][8] << endl;
}
return 0;
}
9.9 分
3 人评分
C语言网提供由在职研发工程师或ACM蓝桥杯竞赛优秀选手录制的视频教程,并配有习题和答疑,点击了解:
一点编程也不会写的:零基础C语言学练课程
解决困扰你多年的C语言疑难杂症特性的C语言进阶课程
从零到写出一个爬虫的Python编程课程
只会语法写不出代码?手把手带你写100个编程真题的编程百练课程
信息学奥赛或C++选手的 必学C++课程
蓝桥杯ACM、信息学奥赛的必学课程:算法竞赛课入门课程
手把手讲解近五年真题的蓝桥杯辅导课程
发表评论 取消回复