bfs對路徑有條件 必須拿到某個東西

2021-07-17 03:26:59 字數 1586 閱讀 8339

乙個bfs,但標記的陣列變化一下,變成三維陣列;其中一維變成標記狀態(已經拿過或者暫時沒有拿過)用的;其餘的都不變;

詳情看例子;;;

hdu2612;

題目鏈結;

題目大意;地圖裡面有ym兩個人,@kfc,#牆,.路,他們兩個人要在地圖裡面找到乙個@kfc,使得兩者到它的距離之和最短;

思路;因為bfs就是最優的,就是最短的距離;因此直接使用bfs從y到m;但是中間要保證經過@ok;否則不能;

關鍵在於怎麼實現bfs從y到m並且經過@呢????

還是使用標記方法;把普通bfs的是否走過的標記變化一下;

判斷是否走過;該題因變化成分狀態的是否走過;相同狀態的不能再入佇列了;

兩種狀態;

1;已經經過過@的;

2;暫時還沒有經過@的;

還要注意一下;這個狀態是伴隨每個格仔的;因此也要是結構體元素;然而要進行初始化;最開始狀態應該都是沒有經過過@的;;;怎麼在結構體裡面對元素進行初始化;

struct node

};

看bfs的**;

bool mark[210][210][2];//又是三維陣列;另外一維是標記狀態用的

void bfs()

if(a >= 0 && a < n && b >= 0 && b < m && mp[a][b] != '#')

if(mark[a][b][next.flag]==1)//與普通的bfs一樣;標記作用。但這裡表示每個格仔在不同狀態是否走過;乙個位置有倆個狀態

continue;

next.x=a;next.y=b;next.step=now.step+1;

q.push(next);}}

}}

完整**;

#include

#include

#include

#include

#include

#include

#include

#include

#include

using

namespace

std;

struct node

};char mp[210][210];

bool mark[210][210][2];

int dir[4][2]=,,,};

int n, m,si,sj,ei,ej;

void bfs()

if(a >= 0 && a < n && b >= 0 && b < m && mp[a][b] != '#')

if(mark[a][b][next.flag]==1)//與普通的bfs一樣;標記作用。但這裡表示每個格仔在不同狀態是否走過;乙個位置有倆個狀態

continue;

next.x=a;next.y=b;next.step=now.step+1;

q.push(next);}}

}}int main()

if(mp[i][j]=='m')}}

bfs();

}return

0;}

myslq有條件插入資料

要求是這樣的 我有乙個表存著基礎資料有乙個欄位是 管理號 我的目的是先查詢最新的管理號按照規則生成新管理號 然後insert到表裡新資料 由於查詢並不鎖表 所以在查詢到insert這步中間會有可能兩線程查詢到相同的管理號?參考了關鍵是如下的mysql語句,插入多條記錄 insert into cli...

有條件的表聯接

表1和表2在聯接時,希望顯示表1的全部記錄以及表2的部分記錄。嘗試使用下面的 sql 語句 select table1.table2as.from table1 left outer join select from table2 where rightname 計畫編制員 as table2as ...

RAILS有條件的校驗

rails中所有的驗證宣告都可以接受 if 選項,可以指定一段在校驗之前執行的 比如 只有在郵箱位址不為空的時候才驗證郵箱位址的格式 使用proc物件,呼叫時,傳入當前的模型物件作為引數,返回false時,不做校驗 validates format of email,with a za z0 9 a...