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

    迷宫问题

    Time Limit : 2000/1000ms (Java/Other)   Memory Limit : 131072/65536K (Java/Other)
    Total Submission(s) : 46   Accepted Submission(s) : 28
    Problem Description
    定义一个二维数组:
    int maze[5][5] = {
    
    	0, 1, 0, 0, 0,
    
    	0, 1, 0, 1, 0,
    
    	0, 0, 0, 0, 0,
    
    	0, 1, 1, 1, 0,
    
    	0, 0, 0, 1, 0,
    
    };

    它表示一个迷宫,其中的1表示墙壁,0表示可以走的路,只能横着走或竖着走,不能斜着走,要求编程序找出从左上角到右下角的最短路线。
     

    Input
    一个5 × 5的二维数组,表示一个迷宫。数据保证有唯一解。
     

    Output
    左上角到右下角的最短路径,格式如样例所示。
     

    Sample Input
    0 1 0 0 0 0 1 0 1 0 0 0 0 0 0 0 1 1 1 0 0 0 0 1 0
     

    Sample Output
    (0, 0) (1, 0) (2, 0) (2, 1) (2, 2) (2, 3) (2, 4) (3, 4) (4, 4)
     
    /*将表格排序,第一行为0,1,2,3,4第二行5,6,7,8,9,规则就是5*横坐标+纵坐标,得到的数除以五
    得到横坐标,对五取余得到纵坐标,用数组的下标来记录这些数,数组里记录上一个数的下标,
    方便查找,而第一个数存的是-1,表示结束*/
    #include<stdio.h>
    #include<string.h>
    #include<queue>
    using namespace std;
    int map[5][5],vis[30],pre[30];
    int dx[4]={1,0,0,-1};
    int dy[4]={0,1,-1,0};
    void pr(int ans)
    {
    	/*for(int i=0;i<30;i++)
    	printf("%d 
    ",pre[i]);*/
    	if(pre[ans]!=-1)/*从终点往回找,找到起点时开始输出*/
    		pr(pre[ans]);
    		printf("(%d, %d)
    ",ans/5,ans%5);
    }
    int judge(int x,int y)
    {
    	if(x<0||x>4||y<0||y>4)
    	return 0;
    	if(map[x][y]==1)
    	return 0;
    	return 1;
    }
    void bfs()
    {
    	queue<int>q;	
    	memset(vis,0,sizeof(vis));
    	pre[0]=-1;
    	vis[0]=1;/*标记已经使用过*/
    	q.push(0);
    	int now,next;
    	int x,y,nx,ny;
    	while(!q.empty())
    	{
    		now=q.front();
    		q.pop();
    		x=now/5;/*调用坐标*/
    		y=now%5;
    		for(int i=0;i<4;i++)
    		{
    			nx=x+dx[i];
    			ny=y+dy[i];
    			next=nx*5+ny;
    			if(judge(nx,ny)&&!vis[next])
    			{
    				pre[next]=now;
    				if(next==24) 
    				return ;/*当查询到最后一个点时,结束*/
    				q.push(next);
    				vis[next]=1;
    			}
    		}
    	}
    }
    int main()
    {
    	int i,j;
    	for(i=0;i<5;i++)
    	for(j=0;j<5;j++)
    	scanf("%d",&map[i][j]);
    	/*for(i=0;i<5;i++)
    	{
    		for(j=0;j<5;j++)
    		printf("%d ",map[i][j]);
    		printf("
    ");
    	}/*输出一遍表,看有没有输入错误*/
    	bfs();
    	pr(24);/*从最后一个点往回找*/
    	return 0;
    }


  • 相关阅读:
    .net core 获取程序中文件路径
    关于autofac的一些具体的用法
    Ztree节点增加删除修改和Icheck的用法
    C# 多线程之Task(任务
    C#开启异步 线程的四种方式
    c# thread数线程的创建
    图片转二进制 ,
    循环中如果有某一次循环抛出异常了整个循环就停止的解决办法
    JAVA 8 Optional的使用
    react 获取指定表单对象中的对象的值
  • 原文地址:https://www.cnblogs.com/playboy307/p/5273855.html
Copyright © 2011-2022 走看看