Gym 101291C 很有意思的最短路)

2022-01-26 05:50:52 字數 1712 閱讀 2283

題意:

給出一張地圖和機械人還有出口的位置,地圖上面有障礙。然後給出udlr上下左右四種指令,遇到障礙物或者越界的指令會忽略,剩下的繼續執行。

只要到達出口就算找到出口,然後給你一串指令,讓你修改指令達到出口,刪除或插入任意乙個指令花費為1,問讓機械人能夠找到出口所花費最少。  

思路:感覺很有意思的一道最短路,思路是把每個點分成變成指令長度個點+1,然後就相當於有n^3個點。然後指令是順序執行的,所以當前點的狀態最多到達

周圍可到達點的同一狀態。所以我們就可以建邊,如果我們走到隔壁點的當前狀態就相當於插入了乙個指令,就當前點到隔壁點建條花費為1的邊。還可以建立

當前點到當前點的下個狀態的邊,花費為1,相當於刪除當前指令。

這道題wa了很久= =然後找到資料對拍,最後發現是因為少建了一種邊,就是指令執行完了,然後走向下乙個點指令執行完了的邊沒有建立。

**:

/** @xigua */

#include #include #include #include #include #include #include #include #include #include #include #include #include #define pi acos(-1)

using namespace std;

typedef long long ll;

typedef double db;

const int maxn = 2e5 + 5;

const int mod = 1e9 + 7;

const int inf = 1e8 + 5;

const ll inf = 1e15 + 5;

const db eps = 1e-6;

int dx = , dy = ;

int n, m;

int cnt, head[maxn], dis[maxn];

struct edge

} e[maxn*5];

void add(int u, int v, int co)

void init()

void dij(int s, int len) ;

dis[s] = 0;

pq.push((edge));

while (!pq.empty()) );}}

}}bool safe(int x, int y)

void solve()

}int x = i, y = j;

if (op[k] == 'r') y++;

else if (op[k] == 'l') y--;

else if (op[k] == 'u') x--;

else x++;

if (safe(x, y))

else

int u = ((i - 1) * m + j) * (len + 1) + k;

add(u, u + 1, 1);

}/* 就是這裡 沒有考慮到建立邊 */

for (int p = 0; p < 4; p++) }}

}dij(st * (len + 1) + 1, (n * m + 1) * (len + 1));

int ans = inf;

for (int i = 1; i <= len + 1; i++)

cout << ans << endl;

}}int main()

return 0;

}

粘性效果,很有意思

article h2 asfasdfh2 asdfsfasfdasfdasfdasfsafdf asdfsfasfdasfdasfdasfsafdf asdfsfasfdasfdasfdasfsafdf asdfsfasfdasfdasfdasfsafdf asdfsfasfdasfdasfdasf...

很有意思的博弈論

一 巴什博奕 bashgame 首先我們來玩乙個比較古老的報數遊戲。a和b一起報數,每個人每次最少報乙個,最多報4個。輪流報數,看誰先報到30.如果不知道巴什博弈的可能會覺得這個是個有運氣成分的問題,但是如果知道的人一定知道怎樣一定可以贏。比如a先報數的話,那麼b一定可以贏 這裡假定b知道怎麼正確的...

一道很有意思的題目

先列出 然後再開始解析 include stdafx.h include using namespace std class a class b public a void seta a data,int idx int tmain int argc,tchar argv for int i 0 i...