原始图
知道上图进行若干镜像和旋转操作之后,一共可以形成8种答案,这道题就好解许多

  1. #include<iostream>
  2. using namespace std;
  3. int arr[9];
  4. //所有情况
  5. int all[8][9] = { {4,9,2,3,5,7,8,1,6},//原始
  6. {8,1,6,3,5,7,4,9,2},//上下翻折
  7. {2,9,4,7,5,3,6,1,8},//左右翻折
  8. {8,3,4,1,5,9,6,7,2},//右旋
  9. {4,3,8,9,5,1,2,7,6},//右旋之左右翻折
  10. {6,7,2,1,5,9,8,3,4},//右旋之上下翻折
  11. {6,1,8,7,5,3,4,9,2},//再右旋
  12. {2,7,6,9,5,1,4,3,8},//再右旋
  13. };
  14. int test(int arr[])
  15. {
  16. int cnt = 0, pos = -1;//cnt计数,pos纪录当仅能还原出一组可行的三阶幻方时,在all[][]数组中的行下标
  17. for (int i = 0; i < 8; i++) {
  18. bool OK = true;
  19. for (int j = 0; j < 9; j++) {
  20. if (arr[j] == 0) continue;//遇到0时跳过
  21. if (arr[j] != all[i][j]) {//与all[][]第i行不匹配时,跳到下一行继续判定
  22. OK = false;
  23. break;
  24. }
  25. }
  26. if (OK) {//如果匹配,个数+1,记录行下标
  27. cnt++;
  28. pos = i;
  29. }
  30. }
  31. if (cnt == 1)//只有一个匹配
  32. return pos;
  33. else
  34. return -1;
  35. }
  36. int main()
  37. {
  38. for (int i = 0; i < 9; i++)
  39. cin >> arr[i];
  40. int index = test(arr);
  41. if (index == -1)
  42. cout << "Too Many" << endl;
  43. else {
  44. cout << all[index][0] << " " << all[index][1] << " " << all[index][2] << endl;
  45. cout << all[index][3] << " " << all[index][4] << " " << all[index][5] << endl;
  46. cout << all[index][6] << " " << all[index][7] << " " << all[index][8] << endl;
  47. }
  48. return 0;
  49. }
点赞(0)
 

9.9 分

3 人评分

 

C语言网提供由在职研发工程师或ACM蓝桥杯竞赛优秀选手录制的视频教程,并配有习题和答疑,点击了解:

一点编程也不会写的:零基础C语言学练课程

解决困扰你多年的C语言疑难杂症特性的C语言进阶课程

从零到写出一个爬虫的Python编程课程

只会语法写不出代码?手把手带你写100个编程真题的编程百练课程

信息学奥赛或C++选手的 必学C++课程

蓝桥杯ACM、信息学奥赛的必学课程:算法竞赛课入门课程

手把手讲解近五年真题的蓝桥杯辅导课程

评论列表 共有 0 条评论

暂无评论