返回顶部

POJ-3984 迷宫问题 (BFS)

  • 题意:有一个\(5\)X\(5\)\(01\)图,输出从左上角走到右下角的最短路径.

  • 题解:基础的bfs,这里困难的是如何输出这个最短路径,我们可以用一个结构体来存点和路径,我们每次向外去拓展的时候,如果满足条件,那么就让这个点的路径继承上个点的路径,这样当我们走到右下角的时候,直接输出路劲然后return即可.

  • 代码:

    struct misaka{
    	int x,y;
    	int cnt;
    	PII path[50];
    }e;
    
    int g[10][10];
    bool st[10][10];
    int dx[4]={0,1,0,-1},dy[4]={1,0,-1,0};
    
    void bfs(){
    	me(st,false,sizeof(st));
    
    	queue<misaka> q;
    	e.x=0,e.y=0;
    	e.cnt=1;
    	e.path[e.cnt]={0,0};
    	q.push(e);
    
    	while(!q.empty()){
    		misaka tmp=q.front();
    		q.pop();
    
    		int x=tmp.x;
    		int y=tmp.y;
    		int cnt=tmp.cnt;
    
    		if(x==4 && y==4){
    			for(int i=1;i<=cnt;++i){
    				printf("(%d, %d)\n",tmp.path[i].fi,tmp.path[i].se);
    			}
    			return;
    		}
    
    		for(int i=0;i<4;++i){
    			int tx=x+dx[i];
    			int ty=y+dy[i];
    			if(tx>=0 && tx<5 && ty>=0 && ty<5 && g[tx][ty]==0 && !st[tx][ty]){
    				e.x=tx;
    				e.y=ty;
    				e.cnt=++cnt;
    				e.path[e.cnt]={tx,ty};
    				q.push(e);
    				st[tx][ty]=true;
    			}
    		}
    	}
    }	
    
    int main() {
        //ios::sync_with_stdio(false);cin.tie(0);cout.tie(0);
    	for(int i=0;i<5;++i){
    		for(int j=0;j<5;++j){
    			scanf("%d",&g[i][j]);
    		}
    	}	
    
    	bfs();
    
        return 0;
    }
    
posted @ 2020-08-12 23:37  _Kolibri  阅读(130)  评论(0)    收藏  举报