題意:
給出一張地圖和機械人還有出口的位置,地圖上面有障礙。然後給出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...