zoukankan      html  css  js  c++  java
  • 迷宫问题 题解

    给出一个(N*M)的迷宫图和一个入口、一个出口。
    编一个程序,打印一条从迷宫入口到出口的路径。这里黑色方块的单元表示走不通(用-1表示),白色方块的单元表示可以走(用0表示)。只能往上、下、左、右四个方向走。
    如果有路则输出路径,否则输出no way.

    题解

    还是比较简单的搜索板子题。
    这里为了方便开了个pos结构体存储位置。

    bfs的时候,每次扩大搜索面积,如果到了终点直接输出即可。
    bfs使用了类链表的结构去存储并输出路径。


    关于dfs,直接在搜索的过程中覆盖记录路径的prt数组即可。

    bfs

    #include <bits/stdc++.h>
    using namespace std;
    const int INF = 0x3f3f3f3f , N = 1e3+5 ;
    typedef unsigned long long ull ;
    typedef long long ll;
    const int dir[5][2] = {{},{1,0},{-1,0},{0,1},{0,-1}};
    int xa,xb,ya,yb,n,m; 
    bool vis[N][N];
    int pre[N][N][2];
    struct pos{int x,y;};
    void printbfs(int x,int y){
    	if(!pre[x][y][1] && !pre[x][y][0]){
    		printf("%d,%d
    ",x,y); 
    		return;
    	}
    	printbfs(pre[x][y][0],pre[x][y][1]);
    	printf("%d,%d
    ",x,y);
    }
    inline bool Edge(int x,int y){
    	return (x < 1 || x > n || y < 1 || y > m || vis[x][y]);
    }
    inline void bfs(){
    	queue<pos>q;
    	q.push((pos){xa,ya});
    	while(!q.empty()){
    		pos u = q.front() ; q.pop();
    		if(vis[u.x][u.y])continue;
    		vis[u.x][u.y] = 1;
    		if(u.x == xb && u.y == yb)break ;
    		for(int d = 1 ; d <= 4 ; d ++){
    			pos v = (pos){u.x + dir[d][0],u.y + dir[d][1]};
    			if(!Edge(v.x,v.y))
    				q.push(v),
    				pre[v.x][v.y][0] = u.x,pre[v.x][v.y][1] = u.y;
    		}
    	}
    	if(!pre[xb][yb][0] && !pre[xb][yb][1])printf("no way
    ");
    	else printbfs(xb,yb);
    }
    signed main(){
    	scanf("%d %d",&n,&m);
    	int tem;
    	for(int i = 1 ; i <= n ; i ++)
    		for(int j = 1 ; j <= m ; j ++)
    			scanf("%d",&tem),
    			vis[i][j] = tem == -1;
    	scanf("%d %d %d %d",&xa,&ya,&xb,&yb);
    	bfs();
    	return 0;
    }
    

    dfs

    #include <bits/stdc++.h>
    using namespace std;
    const int INF = 0x3f3f3f3f , N = 1e3+5 ;
    typedef unsigned long long ull ;
    typedef long long ll;
    const int dir[5][2] = {{},{1,0},{-1,0},{0,1},{0,-1}};
    int xa,xb,ya,yb,n,m; 
    bool vis[N][N];
    int pre[N][N][2];
    struct pos{int x,y;};
    inline bool Edge(int x,int y){
    	return (x < 1 || x > n || y < 1 || y > m || vis[x][y]);
    }
    int prt[10005][3],cnt;bool flag;
    inline void printdfs(int x){
    	for(int i = 0 ; i < x ; i ++)
    		printf("%d,%d
    ",prt[i][0],prt[i][1]);
    	flag = 1;
    	return;
    }
    void dfs(int x,int y,int stp){
    	if(x == xb && y == yb){
    		printdfs(stp);
    		return;
    	}
    	if(flag)return;
    	pos u = (pos){x,y};
    	for(int d = 1 ; d <= 4 ; d ++){
    		pos v = (pos){u.x + dir[d][0],u.y + dir[d][1]};
    		if(vis[v.x][v.y])continue;
    		vis[v.x][v.y] = 1;
    		prt[stp][0] = v.x,prt[stp][1] = v.y;
    		dfs(v.x,v.y,stp + 1);
    	}
    }
    signed main(){
    	scanf("%d %d",&n,&m);
    	int tem;
    	for(int i = 1 ; i <= n ; i ++)
    		for(int j = 1 ; j <= m ; j ++)
    			scanf("%d",&tem),
    			vis[i][j] = tem == -1;
    	scanf("%d %d %d %d",&xa,&ya,&xb,&yb);
    	prt[0][0] = xa,prt[0][1] = ya;
    	dfs(xa,ya,1);
    	if(!flag)printf("no way
    ");
    	return 0;
    }
    
  • 相关阅读:
    C语言第五次作业
    c语言第4次作业
    第12次作业
    C语言第9次作业
    C语言第8次作业2
    C语言第8次作业
    C语言第七次作业---要死了----
    C语言第七次作业
    物联网工程实践第二次作业
    物联网工程实践第一次作业
  • 原文地址:https://www.cnblogs.com/Shinomiya/p/14634486.html
Copyright © 2011-2022 走看看