对于这道题我的看法是,就用在用dfs的时候就已经保证连续性了
然后就只需要把每个走过的路写入集合中,每次都判断这个新的路是否已经存在就行
本质就是在从不同点出发所形成的所有的不重复的路径(相当于列出所有组合形势)
步骤如下:
1.先写好dfs
static void dfs(int group[][],int visited[],int startindex, List <shu> l)
{
visited[startindex]=1;
shu s=new shu();这个是我自己定义的对象,就是一个数组,用于记录当前路径,存到集合里
for(int j=0;j<7;j++)
{
s.a[j]=visited[j];
}
if(pan(l,visited))//判断当前的走过的路径是否已经存在
{
result1++;
l.add(s);
}
for(int i=0;i<7;i++)
{
if(group[startindex][i]==1&&visited[i]==0)
{
visited[i]=1;
dfs(group,visited,i,l);
visited[i]=0;
}
}
visited[startindex]=0;
}
2.判断的函数
static boolean pan( List <shu> l, int visited[])
{
if(l.size()==0)
{
return true;
}
for(int i=0;i<l.size();i++)
{
shu s=new shu();
s=l.get(i);
int length=0;
for(int j=0;j<7;j++)
{
if(s.a[j]==visited[j])
{
length++;
}
}
if(length==7)//length=7的时候表示数组中所有数都相同
{
return false;
}
}
return true;
}
3.在main里这个事情要做七次,因为有七个点
for(int j=0;j<7;j++)
{
题解2.dfs(group,visited, j,l);
}
以上就是三个核心的代码
下面呈现完整代码
import java.util.LinkedList;
import java.util.List;
import java.util.Scanner;
class shu
{
int a[];
shu()
{
a=new int[7];
}
}
class 题解2
{
static int result1;
static void dfs(int group[][],int visited[],int startindex, List <shu> l)
{
visited[startindex]=1;
shu s=new shu();
for(int j=0;j<7;j++)
{
s.a[j]=visited[j];
}
if(pan(l,visited))
{
result1++;
l.add(s);
}
for(int i=0;i<7;i++)
{
if(group[startindex][i]==1&&visited[i]==0)
{
visited[i]=1;
dfs(group,visited,i,l);
visited[i]=0;
}
}
visited[startindex]=0;
}
static boolean pan( List <shu> l, int visited[])
{
if(l.size()==0)
{
return true;
}
for(int i=0;i<l.size();i++)
{
shu s=new shu();
s=l.get(i);
int length=0;
for(int j=0;j<7;j++)
{
if(s.a[j]==visited[j])
{
length++;
}
}
if(length==7)
{
return false;
}
}
return true;
}
}
public class 七段码 {
public static void main(String[] args) {
// TODO Auto-generated method stub
Scanner in =new Scanner(System.in);
int [][]group= {
{0, 1, 0, 0, 0, 1, 0},
{1, 0, 1, 0, 0, 0, 1},
{0, 1, 0, 1, 0, 0, 1},
{0, 0, 1, 0, 1, 0, 0},
{0, 0, 0, 1, 0, 1, 1},
{1, 0, 0, 0, 1, 0, 1},
{0, 1, 1, 0, 1, 1, 0}
};
List <shu> l=new LinkedList<shu>();
int sum=0;
int visited[]=new int[7];
for(int j=0;j<7;j++)
{
题解2.dfs(group,visited, j,l);
}
System.out.println(题解2.result1);
}
}