題目傳送門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本來就慢,...