BZOJ 2464 小明的遊戲

2021-08-03 06:52:35 字數 1746 閱讀 3713

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 的話,請對起...