time limit: 10 sec
memory limit: 128 mb
submit: 829
solved: 338 [
submit][
status][
discuss]
小明最近喜歡玩乙個遊戲。給定乙個n * m的棋盤,上面有兩種格仔#和@。遊戲的規則很簡單:給定乙個起始位置和乙個目標位置,小明每一步能向上,下,左,右四個方向移動一格。如果移動到同一型別的格仔,則費用是0,否則費用是1。請程式設計計算從起始位置移動到目標位置的最小花費。
輸入檔案有多組資料。
輸入第一行包含兩個整數n,m,分別表示棋盤的行數和列數。
輸入接下來的n行,每一行有m個格仔(使用#或者@表示)。
輸入接下來一行有四個整數x1, y1, x2, y2,分別為起始位置和目標位置。
當輸入n,m均為0時,表示輸入結束。
對於每組資料,輸出從起始位置到目標位置的最小花費。每一組資料獨佔一行。
2 2@##@
0 0 1 1
2 2@@
@#0 1 1 0
0 020對於
100%
的資料滿足:
1 < = n, m <= 500。
一道最短路的模板題,瓶頸在於如何將二維節點建圖,所以採取給節點編號的方式,每乙個點[i,j]的編號對應為(i-1)*n+j.
#include#include#include#include#include#include#include#include#define inf 1000000000
using namespace std;
const int maxn=1010;
const int maxq=255000;
struct edge
;edge e[maxn*maxn*4];
int head[maxn*maxn],cnt;
char a[maxn][maxn];
const int dx[4]=;
const int dy[4]=;
void addedge(int u,int v,int w)
bool inqueue[maxn*maxn];
int dis[maxn*maxn];
int n,m;
int q[maxq];
void spfa(int s)
int l=0,r=1;
q[1]=s;
inqueue[s]=1;
dis[s]=0;
while (l!=r)
int x=q[l];
for (int i=head[x];i;i=e[i].next)
int pos=(i-1)*m+j;
pos+=dx[k]*m;
pos+=dy[k];
if (a[nx][ny]==b)
else}}
} int x1,y1,x2,y2;
scanf("%d%d%d%d",&x1,&y1,&x2,&y2);
spfa((x1)*m+y1+1);
printf("%d\n",dis[(x2)*m+y2+1]);
scanf("%d%d",&n,&m);
} return 0;
}
一種優化:提前開乙個陣列g[i,j],記錄每乙個點對應的座標,這樣在讀入時只需要開乙個cnt變數,讀進來乙個數就cnt++,對應的一定是這個點的編號。
BZOJ2464 中山市選 2009 小明的遊戲
time limit 10 sec memory limit 128 mb submit 280 solved 124 submit status 小明最近喜歡玩乙個遊戲。給定乙個n m的棋盤,上面有兩種格仔 和 遊戲的規則很簡單 給定乙個起始位置和乙個目標位置,小明每一步能向上,下,左,右四個方向...
BZOJ2464 中山市選 2009 小明的遊戲
給出乙個n m的字元矩陣,給出起點和終點,每次移動只能上下左右移動,如果走到不同的字元需要1的花費,同種字元不需要花費 求出從起點到終點的最少花費 最短路水題 日常刷水,有益身心健康 include include include include include using namespace st...
小明的遊戲
題目傳送門qwq 前言說實話,剛拿到這道題,我因為懶得將座標轉換為乙個編號,所以直接淦的二維最短路 明明二維最短路更麻煩好吧 在用二維做法a掉這題後,另外寫了正常點的常規最短路 本篇題解將會介紹這兩種做法 提醒這道題給出的起點和終點的座標都是從 0 開始的 所以建圖那些是從 1 到 n 的話,請對起...