题解:UVA11459 Snakes and Ladders

UVA11459 蛇梯棋

大概是长这样子的

题目大意

有一种类似飞行棋的游戏,棋盘上有 100100 个格子,从 11001 \sim 100 编号。若干个玩家轮流掷色子,每次按照掷得的点数将自己的棋子前进若干格。棋盘上有若干个传送门,可将位于格子 aa 的棋子立刻传送至格子 bb。最先到达格子 100100 的玩家获胜,此时游戏立刻终止。保证格子 100100 上没有传送门的入口。

解题思路

模拟题。

每个玩家当前位置存储在数组 pospos 中,用变量 nownow 记录当前掷色子玩家。每到达一个格子后,先判断能否被传送,然后判断游戏是否结束。

需要注意的是,游戏结束后,剩下的掷色子操作无需处理。

代码

#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/
作者
PvbeLLN
发布于
2025年7月15日
许可协议