POJ3278 -- BFS

這是一道非常簡單的BFS。在這裏需要注意的是,要對數據進行剪枝,否則會浪費時間。

在這裏,我們用了倆種數據結構,分別是隊列和數組的方式,來實現BFS。

一。首先我們來看一下通過自定義循環隊列的BFS具體實現:

int BFS(int Person, int cow){
    que* q = (que*)malloc(sizeof(que));
    initQue(q);
    enQ(q,Person);
    count[Person]=0;
    while(q->front!=q->rear){
        int data = deQ(q);
        if(data == cow){
            return count[data];
        }
        if(data>0 && count[data-1] == -1){  //X-1
           enQ(q,data-1);
           count[data-1] = count[data]+1;
        }
        if(data<=cow && count[data+1] == -1){  //X+1
            enQ(q,data+1);
            count[data+1] = count[data]+1;
        }
        if(data<=cow && count[2*data] == -1 ){
            enQ(q,2*data);
            count[2*data] = count[data]+1;
        }
    }
}

1.首先將第一個數據5,進隊列。此時隊列爲: 5

2.然後進入while循環,當隊列不爲空時,將第一個數據5出隊, 並將4/7/10入隊。 此時隊列爲:4 7 10

3.此時,在入隊之前,進行判斷,該數值是否被訪問過(通過count[]數組),以及是否滿足入隊的條件(大於0且小於牛的距離17)。

 

二。通過數組進行模擬隊列的BFS實現。

1。首先定義一個數據結構data,存放當前的座標值x和走的步數step。

2。通過數組queue[MAX] 來存放這個自定義的數據結構data

 

#include <stdio.h>
#include <stdlib.h>


#define MAX 1<<20

int start ,end;

typedef struct data{
	int x;
	int step;
}data;
data queue[MAX];
int flag[MAX];

int BFS(){
	int rear=0;
	int front =0 ;
	int i=0;
	int temp_end=0;
	queue[rear].x =start;
	queue[rear].step =0;
	flag[start]=1;
	rear++; 

	while(front!=rear){  
	
	int temp_x =queue[front].x;
	int temp_step = queue[front].step;
	front++;  

	if(temp_x == end){
		printf("%d\n",temp_step);
		break;
	}

	for(i=0;i<3;i++){
		if(i==0 && temp_x>0) temp_end = temp_x-1;
		if(i==1 && temp_x<=end) temp_end = temp_x+1;
		if(i==2 && temp_x<=end) temp_end = 2*temp_x;

		if(flag[temp_end]==0){  
		queue[rear].x = temp_end;
		queue[rear].step = temp_step+1;
		flag[temp_end]=1;
		rear=(rear+1);
		}
	}
	}
	return 1;
}

int main(){

	memset(queue,0,sizeof(queue));
	memset(flag,0,sizeof(flag));
	freopen("input.txt","r",stdin);
	scanf("%d%d",&start,&end);
	BFS();


	return 0;
}


需要注意的一點是,在進行-1操作時,判斷條件是temp_x>0 ,而不是temp_x>=0,否則會數組越界,flag[-1], POJ提交時,一直報Runtime error


.

發佈了56 篇原創文章 · 獲贊 17 · 訪問量 6萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章