java数据结构 深搜+栈

本文探讨深度优先搜索在图论中的应用,通过实例解释如何利用深度优先搜索解决特定问题,包括图的遍历、环形排列以及质数条件下的数列组合。通过代码实现,展示深度优先搜索在解决实际问题时的灵活性与高效性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

     深度优先搜索遍历类似于树的先序遍历。假定给定图G的初态是所有顶点均未被访问过,在G中任选一个顶点i作为遍历的初始点,则深度优先搜索递归调用包含以下操作:

(1)访问搜索到的未被访问的邻接点;

(2)将此顶点的visited数组元素值置1;

(3)搜索该顶点的未被访问的邻接点,若该邻接点存在,则从此邻接点开始进行同样的访问和搜索。

深度优先搜索DFS可描述为:

1)访问v0顶点;

2)置visited[v0]=1

3搜索v0未被访问的邻接点w若存在邻接点wDFS(w)



A ring is compose of n circles as shown in diagram. Put natural number 1, 2, ..., n into each circle separately, and the sum of numbers in two adjacent circles should be a prime.

Note: the number of first circle should always be 1.


 

Input
n (0 < n < 20).
 

Output
The output format is shown as sample below. Each row represents a series of circle numbers in the ring beginning from 1 clockwisely and anticlockwisely. The order of numbers must satisfy the above requirements. Print solutions in lexicographical order.

You are to write a program that completes above process.

Print a blank line after each case.
 

Sample Input
6 8
 

Sample Output
Case 1: 1 4 3 2 5 6 1 6 5 2 3 4 Case 2: 1 2 3 8 5 6 7 4 1 2 5 8 3 4 7 6 1 4 7 6 5 8 3 2 1 6 7 4 3 8 5 2


package cn.hncu.serch;



import java.util.Scanner;


public class SearchMethodDFS {//hdu 1016


public static void main(String[] args) {
Scanner sc=new Scanner(System.in);
int num=1;
while (sc.hasNext()) {
int n = sc.nextInt();
int[] a = new int[n];//待搜索数
int[] color = new int[a.length];//是否被搜索的标志
int[] parent = new int[a.length];//父节点
for (int i = 0; i < a.length; i++) {
a[i] = i + 1;
color[i] = -1;//表示没搜索
parent[i] = -1;//记录的是父节点的下标
}
int startNode = 0;//开始节点
int count = 0;//表示搜索了几个数
System.out.println("Case "+num+":");
dfs(a, color, parent, startNode, count);
num++;
System.out.println();
}
}


private static void dfs(int[] a, int[] color, int[] parent, int u,
int count) {
color[u]=1;
count++;
if(count==a.length&&isPrime(a[u]+a[0])){
parent[0]=u;
print(a,parent);
}
for(int v=1;v<a.length;v++){
if(color[v]==-1&&isPrime(a[v]+a[u])){
parent[v]=u;//记录的是a的下标
dfs(a, color, parent, v, count);
parent[v]=-1;//因为下次要搜索,所有必须还原
color[v]=-1;
}
}
}


private static void print(int[] a, int[] parent) {
int index[]=new int[a.length];//因为parent记录的是逆序,所有要改过来.
int p=0;//第一个节点
for(int i=0;i<parent.length;i++){
index[parent.length-i-1]=parent[p];
p=parent[p];//自低向上
}
for(int i=0;i<index.length;i++){
if(i==index.length-1){
System.out.println(a[index[i]]);
}else{
System.out.print(a[index[i]]+" ");
}
}
}


private static boolean isPrime(int n) {
if(n==2){
return true;
}else{
for(int i=2;i*i<=n;i++){
if(n%i==0){
return false;
}
}
}
return true;
}


}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值