import java.util.LinkedList;
/**
* BFS和DFS 解决图的遍历
* */
public class IteratorAlgorithm {
public static void main(String[] args) {
// https://blog.csdn.net/yimixgg/article/details/90023121
//index 0~4
int[][] m = {
{ 0, 1, 1, 0, 0 },
{ 0, 0, 1, 1, 0 },
{ 0, 1, 1, 1, 0 },
{ 1, 0, 0, 0, 0 },
{ 0, 0, 1, 1, 0 }
};
//bfs(m,4);
//dfs(m,4);
//递归实现dfs
int[] book=new int[m.length];
book[4] = 1; //1表示已经遍历
System.out.println(4);
dfs2(m,book,4,0);
}
private static void bfs(int[][] m,int index){
//广度优先遍历
//不考虑index异常情况
LinkedList<Integer> queue=new LinkedList<>();
int[] visited = new int[m.length]; //1表示进队列,2表示已遍历
queue.offer(index); //加到队列后面
visited[index] = 1;
while(!queue.isEmpty()){
int i = queue.poll(); //从前面取
visited[i] = 2;
System.out.println(i);
for(int j=0;j<m.length;j++)
if(m[i][j]==1&&visited[j]==0){
queue.offer(j);
visited[j] = 1;
}
}
}
private static void dfs(int[][] m,int index){
//深度优先遍历
//不考虑index异常情况
LinkedList<Integer> stack=new LinkedList<>();
int[] visited = new int[m.length]; //1表示进队列,2表示已遍历
stack.push(index); //压入栈
System.out.println("放入"+index);
visited[index]=1;
while(!stack.isEmpty()){
int tmpIndex= stack.peek(); //返回头部元素不删除
boolean flag=false;
if(visited[tmpIndex]!=2){
System.out.println(tmpIndex);
visited[tmpIndex]=2;
}
for(int i=0;i<m.length;i++){
if(m[tmpIndex][i]==1&&visited[i]==0){
flag=true;
stack.push(i);
System.out.println("放入"+i);
visited[i]=1;
break;
}
}
if(!flag){
System.out.println("删除"+stack.peek());
stack.pop();
}
}
}
//更简单的dfs实现,递归
private static void dfs2(int[][] m,int[] book,int index,int sum){
sum++;
if(sum == m.length){
return;
}
for(int i=0;i<m.length;i++){
if(m[index][i]==1&&book[i]==0){
book[i] = 1;
System.out.println(i);
dfs2(m,book,i,sum);
}
}
}
}