1. 问题描述
  2.   小明最近在教邻居家的小朋友小学奥数,而最近正好讲述到了三阶幻方这个部分,三阶幻方指的是将1~9不重复的填入一个3*3的矩阵当中,使得每一行、每一列和每一条对角线的和都是相同的。
  3.  
  4.   三阶幻方又被称作九宫格,在小学奥数里有一句非常有名的口诀:“二四为肩,六八为足,左三右七,戴九履一,五居其中”,通过这样的一句口诀就能够非常完美的构造出一个九宫格来。
  5.  
  6.   
  7.   
  8.   
  9.  
  10.   有意思的是,所有的三阶幻方,都可以通过这样一个九宫格进行若干镜像和旋转操作之后得到。现在小明准备将一个三阶幻方(不一定是上图中的那个)中的一些数抹掉,交给邻居家的小朋友来进行还原,并且希望她能够判断出究竟是不是只有一个解。
  11.  
  12.   而你呢,也被小明交付了同样的任务,但是不同的是,你需要写一个程序~
  13. 输入格式
  14.   输入仅包含单组测试数据。
  15.   每组测试数据为一个3*3的矩阵,其中为0的部分表示被小明抹去的部分。
  16.   对于100%的数据,满足给出的矩阵至少能还原出一组可行的三阶幻方。
  17. 输出格式
  18.   如果仅能还原出一组可行的三阶幻方,则将其输出,否则输出“Too Many”(不包含引号)。
  19. 样例输入
  20.  
  21. 样例输出
  22.  
  23. 数据规模和约定
  24.   峰值内存消耗(含虚拟机) < 256M
  25.   CPU消耗 < 1000ms
  26.  
  27.   请严格按要求输出,不要画蛇添足地打印类似:“请您输入...” 的多余内容。
  28.  
  29.   注意:
  30.   main函数需要返回0;
  31.   只使用ANSI C/ANSI C++ 标准;
  32.   不要调用依赖于编译环境或操作系统的特殊函数。
  33.   所有依赖的函数必须明确地在源文件中 #include <xxx>
  34.   不能通过工程设置而省略常用头文件。
  35.  
  36.   提交程序时,注意选择所期望的语言类型和编译器类型。
  37.  
  38.   --------------
  39.  
  40.   笨笨有话说:
  41.   我最喜欢这类题目了。既然九宫幻方一共也没有多少,我就不辞辛劳地一个一个写出来好了。
  42.   也不能太过分,好歹用个数组。

记:

"n阶幻方"题目似乎可以用同一个方法解决,具体没有去测试

附上另外一道4阶幻方题目

http://www.cnblogs.com/mind000761/p/8595379.html

示例代码:

  1. #include <stdio.h>
  2. #define MAX 9 /*可放置的最大数*/
  3. #define N 3 /*阶数*/
  4.  
  5. int les = ;
  6. int key = ; /*1到MAX的累加和除以MAX*/
  7. int count = ; /*满足条件的解*/
  8. int arr[N+][N+] = {};
  9. int f[MAX+] = {};
  10. int ans[N+][N+] = {};/*存放解*/
  11.  
  12. void dfs(int x)
  13. {
  14. int i,j,k,s;
  15. if (x > MAX-les)
  16. {
  17. /*剪枝*/
  18. i = arr[][]+arr[][]+arr[][];
  19. j = arr[][]+arr[][]+arr[][];
  20. if (i != key || j != key)
  21. {
  22. return;
  23. }
  24. for (i = ; i <= N ; i ++)
  25. {
  26. s = ;
  27. for (j = ; j <= N ; j ++)
  28. {
  29. s += arr[j][i];
  30. }
  31. if (s != key)
  32. {
  33. return;
  34. }
  35. }
  36.  
  37. count ++;
  38. for (i = ; i <= N ; i ++)
  39. {
  40. for (j = ; j <= N ; j ++)
  41. {
  42. ans[i][j] = arr[i][j];
  43. }
  44. }
  45. return;
  46. }
  47.  
  48. for (i = ; i <= MAX ; i ++)/*遍历1-MAX*/
  49. {
  50. if (!f[i])
  51. {
  52. for (j = ; j <= N ; j ++)
  53. {
  54. s = ;
  55. for (k = ; k <= N ; k ++)
  56. {
  57. if (!arr[j][k])
  58. {
  59. f[i] = ;
  60. arr[j][k] = i;
  61. break;
  62. }
  63. s += arr[j][k];
  64. }
  65. if (f[i])
  66. {
  67. break;
  68. }
  69. if (s != key)
  70. {
  71. return;
  72. }
  73. }
  74. dfs(x+);
  75. arr[j][k] = ;
  76. f[i] = ;
  77. }
  78. }
  79.  
  80. return ;
  81. }
  82.  
  83. int main(void)
  84. {
  85. int i,j;
  86. for (i = ; i <= N ; i ++)
  87. {
  88. for (j = ; j <= N ; j ++)
  89. {
  90. scanf("%d",&arr[i][j]);
  91. if (arr[i][j])
  92. {
  93. f[arr[i][j]] = ;
  94. les ++;
  95. }
  96. }
  97. }
  98.  
  99. dfs();
  100. if (count == )
  101. {
  102. for (i = ; i <= N ; i ++)
  103. {
  104. for (j = ; j <= N ; j ++)
  105. {
  106. printf("%d ",ans[i][j]);
  107. }
  108. printf("\n");
  109. }
  110. }
  111. else
  112. {
  113. printf("Too Many");
  114. }
  115. return ;
  116. }

PREV-42_蓝桥杯_九宫幻方的更多相关文章

  1. ALGO-22_蓝桥杯_算法训练_数的划分(DP)

    问题描述 将整数n分成k份,且每份不能为空,任意两份不能相同(不考虑顺序). 例如:n=,k=,下面三种分法被认为是相同的. ,,; ,,; ,,; 问有多少种不同的分法. 输入格式 n,k 输出格式 ...

  2. java实现第五届蓝桥杯六角幻方

    六角幻方 里面的*在编写的时候会自动编译成线,这里就用代码的格式把题目弄过来 把 1 2 3 ... 19 共19个整数排列成六角形状,如下: * * * * * * * * * * * * * * ...

  3. 蓝桥杯_算法训练_ALGO10_集合运算

    这个题实际上思路是比较简单的,但是需要注意细节问题. 思路:读入数组之后进行排序,然后再求交.并.补集. 首先排序:(使用的是冒泡排序) #include<iostream> using ...

  4. 蓝桥杯_算法训练_Torry的困惑(基本型)

    这个题目就是求质数的乘积,在加一个模,思路比较简单,直接上代码: #include<iostream> using namespace std; bool isPrime(int a) { ...

  5. 蓝桥杯_算法训练_区间k大数查询

    问题描述 给定一个序列,每次询问序列中第l个数到第r个数中第K大的数是哪个. 输入格式 第一行包含一个数n,表示序列长度. 第二行包含n个正整数,表示给定的序列. 第三个包含一个正整数m,表示询问个数 ...

  6. ALGO-43_蓝桥杯_算法训练_A+B Problem

    问题描述 输入A,B. 输出A+B. 输入格式 输入包含两个整数A,B,用一个空格分隔. 输出格式 输出一个整数,表示A+B的值. 样例输入 样例输出 数据规模和约定 -,,,<=A,B< ...

  7. ALGO-39_蓝桥杯_算法训练_数组排序去重

    问题描述 输入10个整数组成的序列,要求对其进行升序排序,并去掉重复元素. 输入格式 10个整数. 输出格式 多行输出,每行一个元素. 样例输入 样例输出 解题思路: 若输入的数字存在数组中,剔除,否 ...

  8. ALGO-115_蓝桥杯_算法训练_和为T(枚举)

    问题描述 从一个大小为n的整数集中选取一些元素,使得它们的和等于给定的值T.每个元素限选一次,不能一个都不选. 输入格式 第一行一个正整数n,表示整数集内元素的个数. 第二行n个整数,用空格隔开. 第 ...

  9. ALGO-117_蓝桥杯_算法训练_友好数

    问题描述 有两个整数,如果每个整数的约数和(除了它本身以外)等于对方,我们就称这对数是友好的.例如: 9的约数和有:+= 4的约数和有:+= 所以9和4不是友好的. 220的约数和有: = 284的约 ...

随机推荐

  1. Codeforces Round #519

    题目链接:传送门   A. Elections (思维+暴力) 思路: 从最小的k开始枚举就好了- -. #include <bits/stdc++.h> using namespace ...

  2. python学习之路02

    1.python的数据类型有:Number String List Truple Sets Dictionary . 数字类型:int float bool complex 2.不可变数据:数字 字符 ...

  3. 2017.5.11 Yarn

    Yarn在hadoop中的位置 Yarn的优点 YARN把JobTracker分为ResouceManager和ApplicationMaster,ResouceManager专管整个集群的资源管理和 ...

  4. spring管理

    spring管理 SqlMapConfig.xml: <?xml version="1.0" encoding="UTF-8"?> <bean ...

  5. Go Example--通道遍历

    package main import ( "fmt" ) func main() { queue := make(chan string, 2) queue <- &quo ...

  6. Go Example--协程

    package main import "fmt" func main() { //main gorouting中调用f函数 f("direct") //重新建 ...

  7. LeetCode - Reorganize String

    Given a string S, check if the letters can be rearranged so that two characters that are adjacent to ...

  8. 【usaco 2006 feb gold】 牛棚安排

    终于自己独立做出来一道题QAQ然而本校数据实在太水不能确定我是不是写对了... 原题: Farmer John的N(1<=N<=1000)头奶牛分别居住在农场所拥有的B(1<=B&l ...

  9. NK实习项目配置

    1.复制eclipse和项目 2.配置tomcat6,现在只能用tomcat6 3.tomcat6插件eclipse是默认有的,只需要配置一下 http://blog.csdn.net/u014079 ...

  10. Modern Data Lake with Minio : Part 1

    转自:https://blog.minio.io/modern-data-lake-with-minio-part-1-716a49499533 Modern data lakes are now b ...