设为首页 加入收藏

TOP

poj 3984 迷宫问题 bfs
2014-11-23 20:00:39 来源: 作者: 【 】 浏览:9
Tags:poj 3984 迷宫 问题 bfs

学会这道水题之后我懂得了不少哈,首先水题也能学到不少知识,尤其像我这样刚入门的小菜鸟,能学到一些小技巧。


然后就是可以从别人的代码里学到不一样的思路和想法。

这题就是求最短的路径,首先想到就是用bfs,但是求到最短之后不知道怎么输出了咋办?很着急有木有???


基本的广搜题已经做的挺熟练的,但是这个记录路径还是没搞懂,大致的方向还是明白的,记录,递归输出。。。。


然后我就找到了写得不错的代码。。然后加上了我“本地化”处理,啊哈~~~~~~~·


 


 
#include   
#include   
#include   
using namespace std;  
int map[5][5],vis[5][5],pre[100];  
struct loca{  
    int x;  
    int y;  
}list[50];  
  
int dir[8] = {0,1,0,-1,1,0,-1,0};  
  
int judge(int x,int y)  
{  
    if(x>=1&&x<5&&y>=0&&y<5&&!map[x][y])  
        return 1;  
    return 0;  
}  
  
void print(int x)   //递归输出哈,菜鸟学习了。。。   
{  
    int t;  
    t = pre[x];  
    if(t == 0)  
    {  
        printf("(0, 0)\n");  
        printf("(%d, %d)\n",list[x].x,list[x].y);  
        return ;  
    }  
    print(t);  
    printf("(%d, %d)\n",list[x].x,list[x].y);  
}  
  
void bfs()  
{  
    int i,head,tail;  
    int x,y,xx,yy;  
    memset(vis,0,sizeof(vis));  
    head = 0;  
    tail = 1;  
    list[0].x = 0;  
    list[0].y = 0;  
    pre[0] = -1;  
    while(head < tail)  
    {  
        x = list[head].x;  
        y = list[head].y;  
        if(x ==4 && y==4)  
        {  
            print(head);  
            return ;  
        }  
        for(i=0;i<8;i+=2)  
        {  
            xx = x + dir[i];  
            yy = y + dir[i+1];  
            if(!vis[xx][yy] && judge(xx,yy))  
            {  
                vis[xx][yy] = 1;  
                list[tail].x = xx;  
                list[tail].y = yy;  
                pre[tail] = head;  
                tail++;  
            }  
        }  
        head ++;  
    }  
    return ;  
}  
  
int main(void)  
{  
    int i,j;  
    for(i=0;i<5;i++)  
       for(j=0;j<5;j++)  
          scanf("%d",&map[i][j]);  
    bfs();  
    return 0;  
}  

#include
#include
#include
using namespace std;
int map[5][5],vis[5][5],pre[100];
struct loca{
	int x;
	int y;
}list[50];

int dir[8] = {0,1,0,-1,1,0,-1,0};

int judge(int x,int y)
{
	if(x>=1&&x<5&&y>=0&&y<5&&!map[x][y])
	    return 1;
    return 0;
}

void print(int x)   //递归输出哈,菜鸟学习了。。。
{
	int t;
	t = pre[x];
	if(t == 0)
	{
		printf("(0, 0)\n");
		printf("(%d, %d)\n",list[x].x,list[x].y);
		return ;
	}
	print(t);
	printf("(%d, %d)\n",list[x].x,list[x].y);
}

void bfs()
{
	int i,head,tail;
	int x,y,xx,yy;
	memset(vis,0,sizeof(vis));
	head = 0;
	tail = 1;
	list[0].x = 0;
	list[0].y = 0;
	pre[0] = -1;
	while(head < tail)
	{
		x = list[head].x;
		y = list[head].y;
		if(x ==4 && y==4)
	    {
	    	print(head);
	    	return ;
	    }
	    for(i=0;i<8;i+=2)
	    {
	    	xx = x + dir[i];
	    	yy = y + dir[i+1];
	    	if(!vis[xx][yy] && judge(xx,yy))
	    	{
	    		vis[xx][yy] = 1;
	    		list[tail].x = xx;
				list[tail].y = yy;
				pre[tail] = head;
				tail++;
			}
		}
		head ++;
	}
	return ;
}

int main(void)
{
	int i,j;
	for(i=0;i<5;i++)
	   for(j=0;j<5;j++)
	      scanf("%d",&map[i][j]);
    bfs();
    return 0;
}



】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
分享到: 
上一篇hdu2594 Simpsons’ Hidden Talen.. 下一篇POJ 1273 || HDU 1532 Drainage D..

评论

帐  号: 密码: (新用户注册)
验 证 码:
表  情:
内  容:

·Python爬虫教程(从 (2025-12-26 16:49:14)
·【全269集】B站最详 (2025-12-26 16:49:11)
·Python爬虫详解:原 (2025-12-26 16:49:09)
·Spring Boot Java: (2025-12-26 16:20:19)
·Spring BootでHello (2025-12-26 16:20:15)