這是一道非常簡單的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
.