题解:UVA11459 Snakes and Ladders
UVA11459 蛇梯棋
大概是长这样子的

题目大意
有一种类似飞行棋的游戏,棋盘上有 个格子,从 编号。若干个玩家轮流掷色子,每次按照掷得的点数将自己的棋子前进若干格。棋盘上有若干个传送门,可将位于格子 的棋子立刻传送至格子 。最先到达格子 的玩家获胜,此时游戏立刻终止。保证格子 上没有传送门的入口。
解题思路
模拟题。
每个玩家当前位置存储在数组 中,用变量 记录当前掷色子玩家。每到达一个格子后,先判断能否被传送,然后判断游戏是否结束。
需要注意的是,游戏结束后,剩下的掷色子操作无需处理。
代码
#include<iostream>
#include<cstring>
#ifdef ONLINE_JUDGE
#define getchar getchar_unlocked
#endif
using namespace std;
inline int read() {
char c=getchar();int x=0,f=1;
for(;!isdigit(c);c=getchar())if(c=='-')f=-1;
for(;isdigit(c);c=getchar())x=x*10+c-48;
return x*f;
}
#define r(a) (a)=read()
int T;
int a,b,c;
int pos[1000005];
int targ[105];
int now,dice;
bool win;
signed main() {
r(T);
while (T--) {
memset(targ,0,sizeof targ);
now=1;
win=0;
r(a); r(b); r(c);
for (int i=1;i<=a;i++)
pos[i]=1;
while (b--)
targ[read()]=read();
while (c--) {
r(dice);
if (win) continue; //此时游戏已经结束
pos[now]+=dice;
pos[now]=min(pos[now],100);
if (targ[pos[now]])
pos[now]=targ[pos[now]];
if (pos[now]==100)
win=1;
now++;
if (now==a+1)
now=1;
}
for (int i=1;i<=a;i++)
printf("Position of player %d is %d.\n",i,pos[i]);
}
return 0;
}题解:UVA11459 Snakes and Ladders
https://pvbelln.github.io/2025/07/15/sol-uva11459/