java实现求解n宫格
2013-09-06 11:42
99 查看
n宫格:奇数阶宫格,使用1-n×n填入其中,使得每一行、每一列、正斜线和反斜线上每n个数的和都相等。
解法:使用网上已有算法,具体见附录。
附录:
九宫格题解法(此方法同样适用于二十五宫格
四十九宫格、八十一宫格)
九宫格涉及的数字少,怕讲不清楚,现以二十五宫格为例,讲解此类题的做法:
例题:请把1—25个数字放入下列空格中,要求做到横、纵、斜角相加均等于65
(所给的数字如有负数或没有按顺序排列,请先把数字按从小到大的顺序进行排列)
第一步:最小的数必须放在最上一行的最中间格。
第二步:第二小的数必须放在最小数所在列右列的最下格。
第三步:往右上格填写第三小的数,只要碰到最右列壁,就将下一个数填入上一行的最左侧格(如3碰到最右列壁后,4则填在上一行的最左侧格)。后面以此类推。
第四步:若右上方有格就一直填下一个数字,若右上方有数字就在上一个数字的下一格填下一个数,(如下图4的右上方有空格就填5,如5的右上方有空格就填6,但1早占了5右上格的位置,因此6就填在5的下一格)。后面以此类推。
第五步:在最上行碰壁后,下一个数要填入右列的最下格(如2、9的填法)。后面以此类推。
第六步:重复前面的规律。
第七步:右上角的下一个数,必定在其下一格。如16必定在15的下一格。
第八步:还是重复前面的规律。
此类题的规律:
1、最小值永远在最上行的中间格,最大值永远在最下行的中间格。
2、最上行碰壁,下一个数填入右列最下格。
3、最右列碰壁,下一个数填入上一行最左格。
4、右上格有空就一直填下一个数;右上格有数,就将下一个数字填入上一个数的下一格。
5、右上角的下一个数,必定在其下一格;左下角的上一个数,必定在其上一格。
不知道讲明白没有。如果看懂了大家不妨用这个方法试试填9宫格、49宫格、81宫格。
解法:使用网上已有算法,具体见附录。
public class N_nine { public static void main(String[] args){ solution(5); } public static void solution(int n){ int[][] nine=new int ; if(n%2==0){ System.out.println("偶数格无法求解!"); return; } int i,j; i=0;j=n/2; int step; for(step=1;step<=n*n;++step){ nine[i][j]=step; //System.out.println(i+" "+j+" step: "+step+" nine:"+nine[i][j]); i=i-1; j=j+1; if(i==-1 && j==n){ i=i+2; j=j-1; } if(i==-1){ i=n-1; } if(j==n){ j=0; } if(nine[i][j]!=0){ i=i+2; j=j-1; } } for(int ii=0;ii<n;++ii){ for(int jj=0;jj<n;++jj){ System.out.print(nine[ii][jj]+" "); } System.out.println(); } } }
附录:
九宫格题解法(此方法同样适用于二十五宫格
四十九宫格、八十一宫格)
九宫格涉及的数字少,怕讲不清楚,现以二十五宫格为例,讲解此类题的做法:
例题:请把1—25个数字放入下列空格中,要求做到横、纵、斜角相加均等于65
(所给的数字如有负数或没有按顺序排列,请先把数字按从小到大的顺序进行排列)
第一步:最小的数必须放在最上一行的最中间格。
1 | ||||
1 | ||||
2 |
1 | ||||
4 | ||||
3 | ||||
2 |
1 | 8 | |||
5 | 7 | |||
4 | 6 | |||
3 | ||||
2 |
1 | 8 | |||
5 | 7 | |||
4 | 6 | |||
3 | ||||
2 | 9 |
1 | 8 | 15 | ||
5 | 7 | 14 | ||
4 | 6 | 13 | ||
10 | 12 | 3 | ||
11 | 2 | 9 |
1 | 8 | 15 | ||
5 | 7 | 14 | 16 | |
4 | 6 | 13 | ||
10 | 12 | 3 | ||
11 | 2 | 9 |
17 | 24 | 1 | 8 | 15 |
23 | 5 | 7 | 14 | 16 |
4 | 6 | 13 | 20 | 22 |
10 | 12 | 19 | 21 | 3 |
11 | 18 | 25 | 2 | 9 |
1、最小值永远在最上行的中间格,最大值永远在最下行的中间格。
2、最上行碰壁,下一个数填入右列最下格。
3、最右列碰壁,下一个数填入上一行最左格。
4、右上格有空就一直填下一个数;右上格有数,就将下一个数字填入上一个数的下一格。
5、右上角的下一个数,必定在其下一格;左下角的上一个数,必定在其上一格。
不知道讲明白没有。如果看懂了大家不妨用这个方法试试填9宫格、49宫格、81宫格。
相关文章推荐
- 基于爬山算法求解TSP问题(JAVA实现)
- [leetcode]分治法求解最大子序列问题——Java实现
- java实现N元一次方程组求解
- 0/1背包问题的动态规划法求解 —— Java 实现
- 动态规划算法分析及实例——求解完全背包问题(java实现)
- java 栈的实现以及栈的典型应用--字符平衡,中缀转后缀,后缀计算,迷宫求解等
- 用非递归方法实现 求解字符串组合的问题 JAVA代码
- 蚁群算法java实现以及TSP问题蚁群算法求解
- 蚁群算法的Java实现求解TSP问题
- Floyd-Warshall算法求解所有结点对的最短路径问题Java实现
- 从拼图游戏开始(四)_IDA*算法求解Java实现
- Java进阶(四十九)实现矩阵秩的求解-转置-行列式-逆矩阵操作
- 用Java代码实现类似Excel单变量求解的功能(Case study-Facebook User Base Growth )
- 回溯法求解N人分N本书的问题(Java实现)
- Java实现算法导论中求解模线性方程解(基于最大公约数欧几里得扩展算法)
- java实现多种方式求解最大公约数
- 用暴力求解法和分而治之法求解最大子数组问题的Java代码实现
- java使用链栈实现迷宫求解
- 回溯法求解N皇后问题(Java实现)
- 快速幂求法(二进制求解)java实现