機械人要在乙個矩形迷宮裡行動(不能原地停留,只能走向上/下/左/右),每移動一格花費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.用這種方法將剩餘部分反覆分解,最後可得到結果。如 ...