1,连接规则
(1)一个点最多与两个其它的点相连。
(2) 在一条直线上的两个端点,如果中间的端点没有被连接,那么这两个端点不能直接相连
(3)线段是有方向的。<1,2>与<2,1>不同
<pre name="code" class="java">package xmltool2;
public class Suoping {
public static int[][] answer=new int[3][3];//存放数据,
public static int total=0;
public static void main(String args[]){
int grid[][]=new int[3][3];
init(grid,1);
int sum=0;
for(int i=1;i<=9;i++){
suoping(grid,i);
System.out.println(total);
sum=sum+total;
total=0;
}
System.out.println(sum);
}
public static void init(int [][]array,int value){
for(int i=0;i<array.length;i++)
for(int j=0;j<array[i].length;j++){
array[i][j]=value;
}
}
public static void suoping(int[][] grid,int count){
if(count==1){
for(int r1=0;r1<3;r1++){
for(int c1=0;c1<3;c1++){
//与上一个节点可以连接,并且此节点没有已选
if(grid[r1][c1]==1&&answer[r1][c1]==0){
answer[r1][c1]=count;
// output(answer);
answer[r1][c1]=0;
total++;
}
}
}
}else{
for(int r=0;r<3;r++){
for(int c=0;c<3;c++){
//节点可以连接,并且此节点没有已选
if(grid[r][c]==1&&answer[r][c]==0){
answer[r][c]=count;
suoping( canLink(r,c),count-1);
//返回上一个状态
answer[r][c]=0;
}
}
}
}
}
//可与当前点能够连接的点
public static int[][] canLink(int i,int j){
int link[][]=new int[3][3];
for(int r=0;r<3;r++){
for(int c=0;c<3;c++){
int rc=r+i;
int yc=c+j;
if(rc%2==0&&yc%2==0){
if(answer[rc/2][yc/2]!=0){
link[r][c]=1;
}else{link[r][c]=-1;}
}else{
link[r][c]=1;
}
}
}
return link;
}
//输出九宫格,连接顺序为按数值从大到小
public static void output(int array[][]){
for(int i=0;i<array.length;i++){
for(int j=0;j<array[i].length;j++){
System.out.print(array[i][j]+" ");
}
System.out.println("");
}
System.out.println("-----------");
}
}
所有遍历情况 http://download.csdn.net/detail/xxuummeenngg/7381115
</pre><pre code_snippet_id="356405" snippet_file_name="blog_20140521_1_4510622" name="code" class="java">
9
56
320
1624
7152
26016
72912
140704
140704
总共389497