地下城奪寶遊戲 杭電OJ 1044題解析

2021-07-15 16:49:52 字數 2256 閱讀 4336

題目大意:乙個探險家身處乙個危險的地下城,城中很危險,並且城中分散著若干個珠寶;現在地下城即將塌陷,冒險家需要在有限的時間內逃出去,但他希望在逃生的過程中獲取一些珠寶並使價值最大化。題目要求用程式計算出最優方案所能獲取的珠寶價值。

以前也遇到過相似的題目,但一直未真正搞明白,最近再次遇到,閱讀了一些大牛的部落格,結合自己的理解,將這個知識點記錄一下。

這道題之所以不能簡單的使用dfs或bfs演算法解決,是因為探險家為了獲取更多價值,可以走重複路徑。最近學習並實現了這道題的兩種解決思路,一種是bfs plus,另一種是bfs+dfs。

一.bfs plus方案

接下來給出該方案的源**:

#include #include #include #include using namespace std;

int w, h, l, m;

char dun[55][55]; //儲存地下城地圖

int jew[10]; //儲存每個珠寶的價值

bool isvisited[1024][55][55]; //記錄bfs過程中某個位置是否經過

//結構體儲存每到乙個位置時的資訊

struct state

;int dx = ;

int dy = ;

int collectjewels()

if (j != w) break;

} begin.j = begin.jews = begin.time = 0;

isvisited[0][begin.x][begin.y] = true;

queueq;

q.push(begin);

int res = -1;

while (!q.empty())

}else if (ch == '<')

q.push(nextpos);

} if(i!=4) break;

} return res;

}int main()

return 0;

}

二.bfs+dfs方案

本方案先進行bfs操作,計算出每個珠寶以及起點和出口兩兩之間的距離(也即時間),然後將這些位置作為結點,將距離作為邊的權值,構造出乙個虛擬圖;接下來使用dfs演算法計算出圖中從起點到出口的最優路徑。這種方案相對於上一方案來說更容易理解。

接下來給出該方案的源**:

#include #include #include using namespace std;

int w, h, l, m, ans, sum;

char dun[55][55]; //儲存地下城地圖資訊

int jew[15]; //儲存每個珠寶的價值

bool isvisited[55][55]; //記錄bfs過程中地圖的訪問狀態

int graph[15][15]; //儲存bfs過程中構造的虛擬圖的資訊

bool isused[15]; //記錄dfs過程中圖中節點的訪問狀態

struct state

};int dx = ;

int dy = ;

void bfs(int x, int y)

else if (ch >= 'a' && ch <= 'j')

else if (ch == '<')

q.push(nextpos);

} }}void dfs(int pos, int time, int je)

for (int i = 1; i < m + 2; i++) }

int main()

//把起始位置和出口記作價值為0的位置,分別用0和m+1標識

jew[0]=jew[m+1]=0;

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

cin >> dun[i];

memset(graph,0,sizeof(graph));

//bfs過程中構造虛圖

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

for (int j = 0; j < w; j++)

memset(isused, 0, sizeof(isused));

isused[0]=true;

ans = -1;

//dfs在途中尋找一條最優路徑

dfs(0, 0, 0);

cout<<"case "《兩方案比較:可以很容易看出,方案一占用的空間較大,效率方面方案一在杭電oj上執行,耗時390ms,占用空間5784k;而方案二耗時46ms,占用空間1624k。總的來說方案二更勝一籌。

地下城遊戲(dp)

題目 題意 給定乙個矩陣,從 0,0 走到 n 1,m 1 每次只能向下和向右走,要求在過程中血量必須保持正值。求最低初始血量。題解 這是最小值最大化問題。正向不好遞推,考慮逆向。令dp i j dp i j dp i j 表示走到該點時需要的最小血量。如果其相鄰點都為負數,代表往後走需要額外消耗,...

龍與地下城遊戲問題

題目 給定乙個二維陣列,含義是一張地圖,例如,如下矩陣 int data 遊戲規則如下 1.騎士從左上角出發,每次只能向下或向右走,最後達到右下角見到公主。2.地圖中每個位置代表騎士血量的變化,若為負數,則表示有怪獸掉血 若為整數,則表示有血包,增加了血量 3.騎士走到任何乙個位置,血量都不能少於1...

龍與地下城遊戲問題

題目 給定乙個二維陣列map,含義是一張地圖,例如,如下矩陣 2 3 3 5 10 1 0 30 5 遊戲的規則如下 騎士從左上角出發,每次只能向右或向下走,最後到達右下角見到公主。地圖中每個位置的值代表騎士要遭遇的事情。如果是負數,說明此處有怪獸,要讓騎士損失血量。如果是非負數,代表此處有血瓶,能...