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 LV10
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日