import?java.util.Scanner;
為隨縣等地區(qū)用戶提供了全套網(wǎng)頁(yè)設(shè)計(jì)制作服務(wù),及隨縣網(wǎng)站建設(shè)行業(yè)解決方案。主營(yíng)業(yè)務(wù)為網(wǎng)站設(shè)計(jì)、做網(wǎng)站、隨縣網(wǎng)站設(shè)計(jì),以傳統(tǒng)方式定制建設(shè)網(wǎng)站,并提供域名空間備案等一條龍服務(wù),秉承以專業(yè)、用心的態(tài)度為用戶提供真誠(chéng)的服務(wù)。我們深信只要達(dá)到每一位用戶的要求,就會(huì)得到認(rèn)可,從而選擇與我們長(zhǎng)期合作。這樣,我們也可以走得更遠(yuǎn)!
import?java.util.Stack;
public?class?DFS
{
//?存儲(chǔ)節(jié)點(diǎn)信息
private?char[]?vertices;
//?存儲(chǔ)邊信息(鄰接矩陣)
private?int[][]?arcs;
//?圖的節(jié)點(diǎn)數(shù)
private?int?vexnum;
//?記錄節(jié)點(diǎn)是否已被遍歷
private?boolean[]?visited;
//?初始化
public?DFS(int?n)
{
vexnum?=?n;
vertices?=?new?char[n];
arcs?=?new?int[n][n];
visited?=?new?boolean[n];
for(int?i?=?0;?i??vexnum;?i++)
{
for(int?j?=?0;?j??vexnum;?j++)
{
arcs[i][j]?=?0;
}
}
}
//?添加邊(無向圖)
public?void?addEdge(int?i,?int?j)
{
//?邊的頭尾不能為同一節(jié)點(diǎn)
if(i?==?j)
return;
arcs[i?-?1][j?-?1]?=?1;
arcs[j?-?1][i?-?1]?=?1;
}
//?設(shè)置節(jié)點(diǎn)集
public?void?setVertices(char[]?vertices)
{
this.vertices?=?vertices;
}
//?設(shè)置節(jié)點(diǎn)訪問標(biāo)記
public?void?setVisited(boolean[]?visited)
{
this.visited?=?visited;
}
//?打印遍歷節(jié)點(diǎn)
public?void?visit(int?i)
{
System.out.print(vertices[i]?+?"?");
}
//?從第i個(gè)節(jié)點(diǎn)開始深度優(yōu)先遍歷
private?void?traverse(int?i)
{
//?標(biāo)記第i個(gè)節(jié)點(diǎn)已遍歷
visited[i]?=?true;
//?打印當(dāng)前遍歷的節(jié)點(diǎn)
visit(i);
//?遍歷鄰接矩陣中第i個(gè)節(jié)點(diǎn)的直接聯(lián)通關(guān)系
for(int?j?=?0;?j??vexnum;?j++)
{
//?目標(biāo)節(jié)點(diǎn)與當(dāng)前節(jié)點(diǎn)直接聯(lián)通,并且該節(jié)點(diǎn)還沒有被訪問,遞歸
if(arcs[i][j]?==?1??visited[j]?==?false)
{
traverse(j);
}
}
}
//?圖的深度優(yōu)先遍歷(遞歸)
public?void?DFSTraverse(int?start)
{
//?初始化節(jié)點(diǎn)遍歷標(biāo)記
for(int?i?=?0;?i??vexnum;?i++)
{
visited[i]?=?false;
}
//?從沒有被遍歷的節(jié)點(diǎn)開始深度遍歷
for(int?i?=?start?-?1;?i??vexnum;?i++)
{
if(visited[i]?==?false)
{
//?若是連通圖,只會(huì)執(zhí)行一次
traverse(i);
}
}
}
//?圖的深度優(yōu)先遍歷(非遞歸)
public?void?DFSTraverse2(int?start)
{
//?初始化節(jié)點(diǎn)遍歷標(biāo)記
for(int?i?=?0;?i??vexnum;?i++)
{
visited[i]?=?false;
}
StackInteger?s?=?new?StackInteger();
for(int?i?=?start?-?1;?i??vexnum;?i++)
{
if(!visited[i])
{
//?連通子圖起始節(jié)點(diǎn)
s.add(i);
do
{
//?出棧
int?curr?=?s.pop();
//?如果該節(jié)點(diǎn)還沒有被遍歷,則遍歷該節(jié)點(diǎn)并將子節(jié)點(diǎn)入棧
if(visited[curr]?==?false)
{
//?遍歷并打印
visit(curr);
visited[curr]?=?true;
//?沒遍歷的子節(jié)點(diǎn)入棧
for(int?j?=?vexnum?-?1;?j?=?0;?j--)
{
if(arcs[curr][j]?==?1??visited[j]?==?false)
{
s.add(j);
}
}
}
}?while(!s.isEmpty());
}
}
}
public?static?void?main(String[]?args)
{
Scanner?sc?=?new?Scanner(System.in);
int?N,?M,?S;
while(true)
{
System.out.println("輸入N?M?S,分別表示圖G的結(jié)點(diǎn)數(shù),邊數(shù),搜索的起點(diǎn):");
String?line?=?sc.nextLine();
if(!line.matches("^\\s*([1-9]\\d?|100)(\\s+([1-9]\\d?|100)){2}\\s*$"))
{
System.out.print("輸入錯(cuò)誤,");
continue;
}
String[]?arr?=?line.trim().split("\\s+");
N?=?Integer.parseInt(arr[0]);
M?=?Integer.parseInt(arr[1]);
S?=?Integer.parseInt(arr[2]);
break;
}
DFS?g?=?new?DFS(N);
char[]?vertices?=?new?char[N];
for(int?i?=?0;?i??N;?i++)
{
vertices[i]?=?(i?+?1?+?"").charAt(0);
}
g.setVertices(vertices);
for(int?m?=?0;?m??M;?m++)
{
System.out.println("輸入圖G的第"?+?(m?+?1)?+?"條邊,格式為“i?j”,其中i,j為結(jié)點(diǎn)編號(hào)(范圍是1~N)");
String?line?=?sc.nextLine();
if(!line.matches("^\\s*([1-9]\\d?|100)\\s+([1-9]\\d?|100)\\s*$"))
{
System.out.print("輸入錯(cuò)誤,");
m--;
continue;
}
String[]?arr?=?line.trim().split("\\s+");
int?i?=?Integer.parseInt(arr[0]);
int?j?=?Integer.parseInt(arr[1]);
g.addEdge(i,?j);
}
sc.close();
System.out.print("深度優(yōu)先遍歷(遞歸):");
g.DFSTraverse(S);
System.out.println();
System.out.print("深度優(yōu)先遍歷(非遞歸):");
g.DFSTraverse2(S);
}
}
import java.util.ArrayList;
import java.util.List;
public class BackTrack {
public static void main(String[] args) {
//初始化一個(gè)集合,放在list里面
ListString list=new ArrayListString();
list.add("1");
list.add("2");
list.add("3");
list.add("f");
ListString li=new ArrayListString();
PowerSet(0,list,li);
}
//回溯法求冪集
public static void PowerSet(int i,ListString list,ListString li){
if(ilist.size()-1){System.out.println(li);}
else{
li.add(list.get(i));//左加
PowerSet(i+1,list,li); //遞歸方法
li.remove(list.get(i)); //右去
PowerSet(i+1, list, li);
}
}
}
注:該方法采用中序遍歷二叉樹(實(shí)際這棵樹是不存在的)。對(duì)于第一個(gè)元素,左節(jié)點(diǎn)加進(jìn)去,右節(jié)點(diǎn)去掉。對(duì)于第i一個(gè)節(jié)點(diǎn),左加,右去。直到i大于元素的總個(gè)數(shù)。
輸出結(jié)果:
[1, 2, 3, 4]
[1, 2, 3]
[1, 2, 4]
[1, 2]
[1, 3, 4]
[1, 3]
[1, 4]
[1]
[2, 3, 4]
[2, 3]
[2, 4]
[2]
[3, 4]
[3]
[4]
[]
//循環(huán)遍歷八個(gè)方向:
for(int dx = -1; dx = 1; dx++) {
for(int dy = -1; dy = 1; dy++) {
//向x方向移動(dòng)dx,向y方向移動(dòng)dy
int nx = x+dx, ny = y + dy;
if()//這里是你要查找的滿足條件的元素
}
}
下面是我修改了滴源碼,是基于一張簡(jiǎn)單的地圖,在地圖上搜索目的節(jié)點(diǎn),依次用深度優(yōu)先、廣度優(yōu)先、Dijkstra算法實(shí)現(xiàn)。
import java.util.ArrayList;
import java.util.HashMap;
import java.util.LinkedList;
import java.util.PriorityQueue;
import java.util.Stack;
/**
*
* @author yinzhuo
*
*/
public class Arithmatic {
boolean flag = true;
// 一張地圖
static int[][] map = new int[][]// 地圖數(shù)組
{
{ 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 },
{ 1, 0, 0, 0, 0, 0, 1, 1, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 },
{ 1, 0, 0, 0, 0, 0, 1, 1, 0, 0, 1, 1, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0 },
{ 1, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0 },
{ 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0 },
{ 1, 0, 0, 0, 0, 0, 1, 1, 1, 0, 1, 1, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0 },
{ 1, 0, 0, 0, 0, 0, 1, 1, 1, 0, 1, 1, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0 },
{ 1, 0, 0, 0, 0, 0, 1, 1, 1, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 },
{ 1, 1, 1, 0, 0, 1, 1, 1, 1, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 },
{ 1, 1, 1, 0, 0, 1, 1, 1, 1, 0, 1, 1, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0 },
{ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0 },
{ 0, 0, 1, 0, 0, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0 },
{ 1, 1, 1, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 1, 1, 1, 1, 0, 0 },
{ 1, 1, 1, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 1, 1, 0, 0, 0 },
{ 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 },
{ 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 },
{ 1, 1, 1, 0, 0, 1, 1, 1, 1, 1, 1, 0, 0, 1, 1, 1, 1, 1, 1, 0, 0, 0 },
{ 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0 },
{ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0 },
{ 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0 },
{ 1, 1, 1, 0, 0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 },
{ 1, 1, 1, 0, 0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 },
{ 1, 1, 1, 0, 0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 } };