小明的遊戲

2022-01-30 06:52:30 字數 2391 閱讀 5999

題目傳送門qwq

前言說實話,剛拿到這道題,我因為懶得將座標轉換為乙個編號,所以直接淦的二維最短路(明明二維最短路更麻煩好吧)

在用二維做法a掉這題後,另外寫了正常點的常規最短路

本篇題解將會介紹這兩種做法

提醒這道題給出的起點和終點的座標都是從\(0\)開始的

所以建圖那些是從\(1\)到\(n\)的話,請對起點終點座標++(雖過不了樣例也會提醒你這個\(point\))

演算法證明

這題一看就是道搜尋(\(dfs\)會被\(t\)掉,\(bfs\)的雙端佇列可以過)

但是這題也能跑最短路,將四個方向轉換為連邊,然後從\(1\)到\(n\)求得最短距離即可

二維最短路

(啊我真優秀)

二維實現最短路還是調了一點時間的,這裡就羅列一下我主要遇到的兩個問題:

建圖連邊的時候,有向邊的方向沒有搞清楚(兩種做法都要注意)

不知道\(dijkstra\)的優先佇列對於二維最短路怎麼進行儲存和排序

然後我們再根據上面兩個問題的解決,來討論思路

當前點向四個方向擴充套件,如果合法,那麼有向邊當然是當前點連向其他點

注意一下:向四個方向擴充套件時要判斷是否越界!

在自定義結構體內使用過載運算子!

**段:

struct node 

} e[5200010];

priority_queueq;

這樣定義後,在跑二維最短路的時候就可以正常維護啦

#include using namespace std;

char s[5001][5001];

int n,m,sx,sy,ex,ey;

int tot,dis[5001][5001],vis[5001][5001],head[5001][5001];

struct node

} e[5200010];

priority_queueq; //過載運算子之後的優先佇列

inline void add(int fx,int fy,int nx,int ny,int w)

inline void dijkstra(int fx,int fy)

} dis[fx][fy]=0;

q.push((node) );

while(!q.empty()) );

}} }

}int main()

} scanf("%d%d%d%d",&sx,&sy,&ex,&ey);

sx++;sy++; //注意輸入是從0開始

ex++;ey++;

for(register int i=1;i<=n;i++)

} dijkstra(sx,sy);

printf("%d\n",dis[ex][ey]);

} return 0;

}

常規最短路

講真,常規最短路其實就是上面二維最短路的優化(二維最短路屬於不動腦子,直接給什麼做什麼,常規的最短路就需要轉換,但是轉換之後**更簡便也更容易實現)

為什麼要將座標轉換為編號?因為這樣我們就將維護二維最短路改成常規的最短路了,接下來就不用想什麼過載運算子後用優先佇列維護三個值了

因為常規最短路的思路真的很簡單,就是跑板子,所以直接給**啦qwq

#include using namespace std;

char s[510][510];

int n,m,sx,sy,ex,ey,tot,cnt;

dequeq;

int sum[510][510],dis[520010],vis[520010],head[520010];

struct node e[520010];

inline void add(int u,int v,int w)

inline void spfa(int s)

dis[s]=0;

vis[s]=1;

q.push_back(s);

while(!q.empty())

} scanf("%d%d%d%d",&sx,&sy,&ex,&ey);

sx++;sy++;ex++;ey++;

for(register int i=1;i<=n;i++)

} spfa(sum[sx][sy]);

printf("%d\n",dis[sum[ex][ey]]);

} return 0;

}

嗯...寫完了...

謝謝各位dalao啊qwq

BZOJ 2464 小明的遊戲

time limit 10 sec memory limit 128 mb submit 829 solved 338 submit status discuss 小明最近喜歡玩乙個遊戲。給定乙個n m的棋盤,上面有兩種格仔 和 遊戲的規則很簡單 給定乙個起始位置和乙個目標位置,小明每一步能向上,下...

小紅和小明的數字遊戲

小紅和小明在玩乙個數字遊戲,遊戲規則如下 開始時有乙個數字n,小紅和小明依次對這個數字進行操作,每次操作,都可以使這個數字 增加1到n之間的任意整數,在誰加完數字之後能使得這個數字的大小 大於或者等於m,他就能夠取得遊戲的勝利,小紅和小明都想取得遊 戲的勝利,假設他們都在自己的最優策略之下,由小紅先...

P4554 小明的遊戲

小明的遊戲就是玩棋盤?和這道題有啥區別啊。如果不加多組測試資料,這道題可能還沒那道題難。好了,吐槽結束 首先還是按照比較常規的思路來想,上下左右都已經寫出來了,dfs和bfs沒得跑,蒟蒻不太會處理bfs,因為實在沒有想出來怎麼寫,所以第一次我寫的是dfs 記憶化搜尋,水了60分,因為dfs本來就慢,...