解决方案 »
- java删除zip文件
- jtable中如何显示三个并行的复选框
- 到主机 的 TCP/IP 连接失败
- 有没在线JSP高手啊?帮忙啦!崩溃,在线等
- 一个很白痴的问题``
- 有关接口 EventListener的问题~~这个接口中什么都没有定义,为什么好多类都还要继承它呢?~这是为什么?
- 在socket通信中,怎样在建立连接后,服务器方 向客户端传送文件?
- 怎样在linux上用rpm包安装jre?
- 求助,多谢
- 请问“java console”如何关闭?
- ArrayList实现了List接口,为什么没有重写其iterator();抽象方法???为什么
- 初学者,关于myEclipese中用SVN检出文件的问题。
第一步、全排列
第二步、对于某一种排列,检测其是否符合魔方阵,符合的输出第二步好理解,剩下的就是“全排列”函数了,一个DFS算法即可搞定,而且比他的快多了public class AllPerm { public static int[][] qipan=new int[3][3];
public static int count=0;
/**深度优先型全排列
*/
public static void allPerm(int[] indexArray,int level){
if(level==indexArray.length-1){
//到达子节点 检测、输出
checkAndPrint(indexArray);
}else{
//递归第一个子节点
allPerm(indexArray, level+1);
for(int i=level+1;i<indexArray.length;i++){
//提取前缀
swap(indexArray, level, i);
//递归对应子树
allPerm(indexArray, level+1);
//回溯
swap(indexArray, level, i);
}
}
}
public static void checkAndPrint(int[] indexArray){
int index=0;
for(int i=0;i<3;i++){
for(int j=0;j<3;j++){
qipan[i][j]=indexArray[index];
index++;
}
}
//行检测
for(int i=0;i<3;i++){
int sum=0;
for(int j=0;j<3;j++){
sum+=qipan[i][j];
}
if(sum!=15){
return;
}
}
//列检测
for(int j=0;j<3;j++){
int sum=0;
for(int i=0;i<3;i++){
sum+=qipan[i][j];
}
if(sum!=15){
return;
}
}
//对角线检测
int sum=0;
for(int i=0;i<3;i++){
sum+=qipan[i][i];
}
if(sum!=15){
return;
}
sum=0;
for(int i=0;i<3;i++){
sum+=qipan[i][2-i];
}
if(sum!=15){
return;
}
count++;
System.out.println("第"+count+"个结果:");
for(int i=0;i<3;i++){
for(int j=0;j<3;j++){
System.out.print(qipan[i][j]+" ");
}
System.out.println();
}
}
public static void swap(int[] array,int a,int b){
int temp=array[a];
array[a]=array[b];
array[b]=temp;
} public static void main(String[] args) {
int[] indexArray=new int[9];
for(int i=0;i<9;i++){
indexArray[i]=i+1;
}
allPerm(indexArray, 0);
}
}