swust 1646 迷宮與寶藏

2021-07-11 01:59:02 字數 1450 閱讀 6741

機械人要在乙個矩形迷宮裡行動(不能原地停留,只能走向上/下/左/右),每移動一格花費1個單位時間。

迷宮有以下幾種元素:

【*】 機械人的起點

【#】 牆。機械人不能走過這些格仔

【.】 平地。機械人可以在上面自由行走

【0-9】 寶藏。當機械人走到此處會立刻獲得該數字相應的寶藏,寶藏不會消失,可以反覆獲取(但不能停留)

若機械人要恰好獲得總和為x的寶藏,它最少需要多少時間?

先是用dfs做了一次,案例過了,提交爆記憶體,資料過大明顯dfs不行  還是貼一下**  

#include#include//爆記憶體

char map[2000][2000];

int dir[4][2]=;

int n,m,t,sum;

int use[2000][2000];

void dfs(int x,int y,int time,int money)

else}}

}int main()

scanf("%d",&sum);

for(int i=0;i<=n;i++)}}

dfs(dx,dy,0,0);

if(t==9999999)

printf("-1\n");

else

printf("%d\n",t);

}return 0;

}

bfs寫,注意use標記陣列,儲存走到該點獲得該寶藏的最小步數,

#include#include#include#define maxn 105

using namespace std;

int dir[4][2]=;

char map[105][105];

int n,m,time,sum;

int use[105][105][105]; //表示走到該點獲得的寶藏的最小步數

struct node

;queueque;

int bfs()}}

}return -1;

}int main()

scanf("%d%d",&n,&m);

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

}for(int i=0;i<=n;i++)

scanf("%s",map[i]);

scanf("%d",&sum);

for(int i=0;i<=n;i++) //預處理 把圖上面的.都變為0;

if(map[i][j]=='.')

map[i][j]='0';}}

if(sum==0)

printf("0\n");

else

printf("%d\n",bfs());

}return 0;

}

zcmu 1646 盒子遊戲

e 盒子遊戲 有兩個相同的盒子,其中乙個裝了n個球,另乙個裝了乙個球。alice和bob發明了乙個遊戲,規則如下 alice和bob輪流操作,alice先操作。每次操作時,遊戲者先看看哪個盒子裡的球的數目比較少,然後清空這個盒子 盒子裡的球直接扔掉 然後把另乙個盒子裡的球拿一些到這個盒子中,使得兩個...

SWUST 2489 上決欺負HZF

題意 由於hzf長得太帥,被各種人調戲是絕對的啦!今天上決十分的無聊,於是就去欺負hzf不會資料結構,嘻嘻。來點簡單的嘛,免得峰哥報復,那就 hzf嘿嘿一笑 看我無敵版函式式平衡逆天啟發式線段樹!input 多組。第一排兩個個正整n,m n 500,000。m 1000,000。接下來n個整數ai ...

SWUST626 分數分解

分子為1 的分數稱為埃及分數,現輸入乙個真分數,請將該分數按下面的方法分解為埃及分數 1.若真分數的分子a能整除分母b,則真分數經過化簡就可以得到埃及分數 2.若真分數的分子不能整除分母,則可以從原來的分數中分解出乙個分母為b a 1的埃及分數 3.用這種方法將剩餘部分反覆分解,最後可得到結果。如 ...