package com.lyk.exercise;
/**
* 九宫格算法实现类
* 我现在的思路是将3*3个数字进行全排列
* 在全排列的过程中进行检索满足条件的排列
* 然后在显示出来
* 可能这个算法还有待优化
* 将数字存放到数组里面然后再递归回溯
* 目前只能实现3*3的魔方更大的话就太耗时间了
* @author LYk
*
*/
public class NineCell {
/**
* 判断每行每列以及对角线的值是否满足条件
*
* @param number 检索的数组
* @return true is 满足条件 否则false不满足条件
*/
private boolean right(int []number){
int size=(int) Math.sqrt(number.length);
int [][]ary=new int[size][size];
int index=0;
int check=stand(number);
//将一维数组转化为二维数组
for(int row=0;row<size;row++){
for(int column=0;column<size;column++){
ary[row][column]=number[index];
index++;
}
}
int result=0;
//检测每一行的值是否相等
for(int row=0;row<size;row++){
for(int column=0;column<size;column++){
result+=ary[row][column];
}
if(result!=check){
return false;
}
result=0;
}
//判断每列的值是否相等
for(int row=0;row<size;row++){
for(int column=0;column<size;column++){
result+=ary[column][row];
}
if(result!=check){
return false;
}
result=0;
}
//判断对角线的值是否相等
for(int i=0;i<size;i++){
result+=ary[i][i];
}
if(result!=check){
return false;
}
result=0;
for(int column=size-1,row=0;column>=0&&row<size;column--,row++){
result+=ary[row][column];
}
if(result!=check){
return false;
}
return true;
}
/**
* 打印满足九宫格条件的数组
* @param number
*/
private void printResults(int []number){
int row=(int) Math.sqrt(number.length);
for(int i=0;i<number.length;i++){
System.out.print(number[i]+"\t");
if((i+1)%row==0){
System.out.println();
}
}
System.out.println();
}
/**
* 计算出满足N*N使每行每列及对角线都相等的值
* 比如3*3的格子每行每列的值都及对角线的值都等于15
* @param number
* @return
*/
private int stand(int []number){
int size=number.length;
int row=(int) Math.sqrt(size);
return (int) ((1+size)*size*Math.pow(2, -1))/row;
}
/**
* 将N*N个数字进行全排列
* @param n数字
*/
private void coreCode(int []number,int begin,int end){
int row=(int) Math.sqrt(number.length);
//如果是偶数阶则返回
if(row%2==0){
return;
}
else if (begin == end) {// 如果begin等于end说明,数组中的元素交换完毕,可以进行打印输出
if(number[end/2]==(number.length+1)/2&&right(number))//判断是否为奇数阶魔方如果是就打印输出
printResults(number);
}
else {// 如果元素还没有交换完毕,继续进行递归
for (int i = begin; i <= end; i++) {
int temp = number[begin];// 将首元素与其后的第i个元素进行交换
number[begin] = number[i];
number[i] = temp;
// 判断中间那个数是否是N*N正阶魔方的长度的一半
coreCode(number, begin + 1, end);
// 还原数组
number[i] = number[begin];
number[begin] = temp;
}
}
}
public static void main(String[] args) {
int []number={1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25};
int []number1={1,2,3,4,5,6,7,8,9};
new NineCell().coreCode(number1, 0, 8);
System.out.println(222);
}
}
最近下载更多
1112WHQ LV7
2023年11月3日
090909梁婷仪 LV1
2022年11月19日
2196316269 LV10
2021年2月25日
chc19951224 LV1
2021年1月12日
19960721 LV9
2020年3月31日
xmjying LV13
2019年8月23日
天险无涯 LV15
2019年7月26日
你头发乱了喔_ LV1
2019年6月13日
heianqishizhisuiyuan LV3
2019年3月9日
zbbvnbjgda LV3
2018年11月27日
最近浏览更多
1112WHQ LV7
2023年11月3日
宋好帅 LV3
2023年7月24日
llxxtt LV2
2023年6月5日
wuziayng1232 LV11
2023年2月20日
3272047233 LV1
2022年12月14日
090909梁婷仪 LV1
2022年11月19日
微信网友_6190641661054976 LV2
2022年10月26日
爱情戴罪的羔羊 LV7
2022年9月15日
liupengfei LV7
2022年9月13日
ljt289917726 LV3
2022年9月5日

