• [BFS]电子老鼠闯迷宫


    电子老鼠闯迷宫

    Description

    如下图12×12方格图,找出一条自入口(2,9)到出口(11,8)的最短路径。

    在这里插入图片描述


    Input


    Output


    Sample Input

    12 //迷宫大小
    2 9 11 8 //起点和终点
    1 1 1 1 1 1 1 1 1 1 1 1 //邻接矩阵,0表示通,1表示不通
    1 0 0 0 0 0 0 1 0 1 1 1
    1 0 1 0 1 1 0 0 0 0 0 1
    1 0 1 0 1 1 0 1 1 1 0 1
    1 0 1 0 0 0 0 0 1 0 0 1
    1 0 1 0 1 1 1 1 1 1 1 1
    1 0 0 0 1 0 1 0 0 0 0 1
    1 0 1 1 1 0 0 0 1 1 1 1
    1 0 0 0 0 0 1 0 0 0 0 1
    1 1 1 0 1 1 1 1 0 1 0 1
    1 1 1 1 1 1 1 0 0 1 1 1
    1 1 1 1 1 1 1 1 1 1 1 1


    Sample Output

    (2,9)->(3,9)->(3,8)->(3,7)->(4,7)->(5,7)->(5,6)->(5,5)->(5,4)->(6,4)->(7,4)->(7,3)->(7,2)->(8,2)->(9,2)->(9,3)->(9,4)->(9,5)->(9,6)->(8,6)->(8,7)->(8,8)->(9,8)->(9,9)->(10,9)->(11,9)->(11,8)
    27


    代码

    #include<stdio.h>
    #include<iostream>
    using namespace std;
    const int dx[5]={0,0,-1,0,1};
    const int dy[5]={0,-1,0,1,0}; //四个可延伸的点
    int n,x1,y1,x2,y2,a[1005][1005],fa[1005],st[1005][2],ans,last;
    int check(int x,int y){ //判断这个点能不能延伸
    	if(x>0 and x<=n and y>0 and y<=n)
    	 if(a[x][y]==0)return 1;
    	return 0;
    }
    void print(int x){ //输出
    	if(x==0)return ;
    	ans++;
    	print(fa[x]);	
    	if(x!=last)
    	 printf("(%d,%d)->",st[x][0],st[x][1]);
    	  else printf("(%d,%d)
    ",st[x][0],st[x][1]);  
    	
    }
    void bfs(){
    	int head=0,tail=1;
    	st[1][0]=x1;st[1][1]=y1; 
    	fa[1]=0;
    	do{
    		head++;
    		for(int i=1;i<=4;i++){
    			if(check(st[head][0]+dx[i],st[head][1]+dy[i])){
    				tail++;				
    				fa[tail]=head; //入队
    				st[tail][0]=st[head][0]+dx[i];
    				st[tail][1]=st[head][1]+dy[i]; 
    				a[st[tail][0]][st[tail][1]]=1; //标记为走过的
    			}
    			if(st[head][0]==x2 and st[tail][1]==y2){ //判断有没有到达终点
    				last=tail;
    				print(tail);
    				printf("%d",ans);
    				return ;
    			}
    		}
    	}while(head<=tail); 
    }
    int main(){
    	scanf("%d",&n);
    	scanf("%d%d%d%d",&x1,&y1,&x2,&y2);
    	for(int i=1;i<=n;i++)
    	 for(int j=1;j<=n;j++)
    	  scanf("%d",&a[i][j]);
    	bfs(); 
    	return 0;
    }
    
  • 相关阅读:
    Elasticsearch 分词
    Elasticsearch:文档乐观锁控制 if_seq_no与if_primary_term
    调用javaAPI访问hive
    sqoop笔记
    hive学习
    添加用户到sudo组
    HTTP协议用的TCP但是只建立单向连接
    Hadoop基本操作
    Hadoop原理介绍
    sed用法
  • 原文地址:https://www.cnblogs.com/luojunhang/p/12300163.html
Copyright © 2020-2023  润新知