hdu1044 bfs dfs bfs 狀態壓縮

2021-07-24 04:27:43 字數 1385 閱讀 6164

1.狀態壓縮記錄狀態,用十位的二進位制數表示每個寶石選還是不選,共有2^10=1024個狀態,開個陣列vis[maxn][maxn][1024]判斷在每一點是否達到該狀態,bfs搜尋最短路徑,w*h*1024個狀態都要搜到,複雜度較高

#include #include #include using namespace std;

int w, h, l, m;

bool vis[55][55][1100];

char g[55][55];

int money[15];

int dx = ;

int dy = ;

struct node

;bool check(int x, int y)

int bfs(int sx, int sy)

return 0;

}

2.bfs+dfs

bfs找到出口到每個寶石,每個寶石之間和所有寶石到出口的路徑,只用搜尋每個x,y是否已經到達過,複雜度大大降低

dfs找到在time limit內是否能找到出口,記錄能拿到的寶石的最大值

#include#include#includeusing namespace std;

char g[55][55];

int dis[30][30];

int j[15]; int tot;

bool vis1[55][55];

bool vis2[30];

int step[55][55];

int t, w, h, l, m;

int dx = ;

int dy = ;

bool check(int x, int y)

void bfs(int x, int y, int tag)}}

}int ans;

void dfs(int tag,int val,int t)

for (int i = 0; i <= m + 1; ++i)

}}int main()

j[0] = 0; j[m + 1] = 0;//0代表入口,m+1代表出口,1~m代表寶石

for (int i = 0; i < h; ++i)

for (int i = 0; i < h; ++i)

}ans = -1;

memset(vis2, 0, sizeof(vis2));

vis2[0] = 1;

dfs(0,0,0);

printf("case %d:\n", c);

if (ans >= 0)printf("the best score is %d.\n", ans);

else printf("impossible\n");

if (c

hdu 4770 狀壓 列舉

長記性了,以後對大陣列初始化要注意了!140ms 原來是對vis陣列進行每次初始化,每次初始化要200 200的複雜度 一直超時,發現沒必要這樣,直接標記點就行了,只需要乙個15的陣列用來標記,vis陣列用來對映座標就行了 然後就是暴力加了一點優化,下面沒有加優化。include include d...

HDU2489 狀壓列舉

題意 給你n個點的圖,然後讓你在圖里挑m個點,達到sumedge sumnode最小 思路 由於資料範圍小,狀壓列舉符合m個點的狀態,我是用vactor存了結點位置,也記錄了結點的sum值,然後跑一發最小生成樹就可以知道sumedge,這裡判斷可以利用乘法,然後更新乙個狀態就好了 include u...

HDU2489 狀壓列舉

題意 給你n個點的圖,然後讓你在圖里挑m個點,達到sumedge sumnode最小 思路 由於資料範圍小,狀壓列舉符合m個點的狀態,我是用vactor存了結點位置,也記錄了結點的sum值,然後跑一發最小生成樹就可以知道sumedge,這裡判斷可以利用乘法,然後更新乙個狀態就好了 include u...