邻接矩阵创建邻接表,进行遍历

img


输入图的邻接矩阵数据
创建图的邻接表并输出
按照DFS遍历输出
按照BFS遍历输出

  • 这个问题的回答你可以参考下: https://ask.csdn.net/questions/649398
  • 这篇博客你也可以参考下:数据结构学习,图的遍历(DFS和BFS)
  • 除此之外, 这篇博客: 深度优先搜索(DFS)与宽度优先搜索(BFS)解析及例题_c语言中的 3.1 迷宫的最短路径 部分也许能够解决你的问题, 你可以仔细阅读以下内容或跳转源博客中阅读:
  • 问题描述
    给定一个大小为N*M的迷宫。迷宫由通道和墙壁组成,每一步可以向邻接的上下左右四格的通道移动。请求出从起点到终点所需的最小步数(起点一定可以到达终点)。
    限制条件
    N,M<=100
    样例
    输入:N=10,M=10

    //迷宫如下图所示。'#','.','S','G'分别表示墙壁,通道,起点和终点。
    #S######.#
    ......#..#
    .#.##.##.#
    .#........
    ##.##.####
    ....#....#
    .#######.#
    ....#.....
    .####.###.
    ....#...G#
    

    输出:22
    分析
    宽度优先搜索按照距离开始状态由近及远的顺序进行搜索,因此可以很容易地用来求最短路径、最少操作之类问题的答案。
    首先将起点存入队列,然后从队列中取出队头元素,遍历队头元素上下左右四个方向的通道。若其不是终点,则将此点加入队列,并存储从开始到该点的距离。然后处理下一个遍历到的点…直至队列为空。
    代码

    #include<stdio.h>
    #define INF 100000000
    #define MAX_N 100
    #define MAX_M 100
    //输入 
    char maze[MAX_N][MAX_M+1];  //表示迷宫的字符串的数组 
    int N,M;
    int sx,sy;  //起点坐标
    int gx,gy;  //终点坐标
    int d[MAX_N][MAX_M];   //到各个位置的最短距离的数组
    
    //队列存储结构
    int queue_x[MAX_N*MAX_M];  //存储进入队列的横坐标 
    int queue_y[MAX_N*MAX_M];  //储进入队列的纵坐标 
    int front,rear;
    
    //将坐标(x,y)加入队列queue_x,queue_y
    void enQueue(int x, int y){
    	queue_x[rear++] = x;
    	queue_y[rear++] = y;
    }
    
    //将横坐标为x的移出queue_x队列 
    int deQueue_x(){
    	return queue_x[front++];
    }
    
    //将纵坐标为y的移出queue_y队列 
    int deQueue_y(){
    	return queue_y[front++];
    }
    
    //求从{sx,sy}到{gx,gy}的最短路径
    //如果无法到达,则是INF
    void bfs(){
    	//初始化
    	front = 0;
    	rear = 0;
    	 
    	//当前遍历到的坐标 
    	int current_x,current_y;
    	
    	//把所有的位置都初始化为INF
    	for(int i=0; i<N; i++)
    		for(int j=0; j<M; j++)
    			d[i][j] = INF;
    	
    	//将起点加入队列,并把这一地点的距离设置为0
    	enQueue(sx,sy);
    	d[sx][sy] = 0;
    	
    	//不断循环, 直到队列的长度为0
    	while(maze[current_x=deQueue_x()][current_y=deQueue_y()] != 'G'){
    		//遍历左右两面 
    		for(int dx=-1,dy=0; dx<=1; dx+=2){
    			int x = current_x + dx;
    			int y = current_y + dy;
    			if(x>=0 && x<N && y>=0 && y<M){  //判断未出界 
    				if((maze[x][y]=='G' || maze[x][y]=='.') && d[x][y]==INF){
    					d[x][y] = d[current_x][current_y] + 1;
    					enQueue(x,y);
    				}
    			}
    		}
    		//遍历上下两面 
    		for(int dy=-1,dx=0; dy<=1; dy+=2){
    			int x = current_x + dx;
    			int y = current_y + dy;
    			if(x>=0 && x<N && y>=0 && y<M){   //判断未出界 
    				if((maze[x][y]=='G' || maze[x][y]=='.') && d[x][y]==INF){
    					d[x][y] = d[current_x][current_y] + 1;
    					enQueue(x,y);
    				} 
    			}
    		}
    	} 
    } 
    
    int main(){
    	scanf("%d %d",&N,&M);
    	getchar();
    	for(int i=0; i<N; i++){
    		for(int j=0; j<M; j++){
    			scanf("%c",&maze[i][j]);
    			//确定起点坐标 
    			if(maze[i][j] == 'S'){
    				sx = i;
    				sy = j;
    			}
    			//确定终点坐标
    			if(maze[i][j] == 'G'){
    				gx = i;
    				gy = j;
    			} 
    		}
    		getchar();
    	}
    	bfs();
    	//输出最终结果 
    	printf("%d\n",d[gx][gy]);
    	return 0;		
    }
    
  • 您还可以看一下 孙玖祥老师的图解数据结构与算法课程中的 DFS递归代码实现-非递归原理小节, 巩固相关知识点

https://ask.csdn.net/questions/7965978
还是之前的问题么?贴一下你的错误信息,以及你的输入,看下