程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> C++ >> C++入門知識 >> poj 3984 迷宮問題 bfs

poj 3984 迷宮問題 bfs

編輯:C++入門知識

      學會這道水題之後我懂得了不少哈,首先水題也能學到不少知識,尤其像我這樣剛入門的小菜鳥,能學到一些小技巧。

     


        然後就是可以從別人的代碼裡學到不一樣的思路和想法。

 

 

       這題就是求最短的路徑,首先想到就是用bfs,但是求到最短之後不知道怎麼輸出了咋辦?很著急有木有???

 


       基本的廣搜題已經做的挺熟練的,但是這個記錄路徑還是沒搞懂,大致的方向還是明白的,記錄,遞歸輸出。。。。

 


      然後我就找到了寫得不錯的代碼。。然後加上了我“本地化”處理,啊哈~~~~~~~·


 


 
#include<iostream>   
#include<stdio.h>   
#include<string.h>   
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<iostream>
#include<stdio.h>
#include<string.h>
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;
}



 

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved