列表

详情


NC14539. 做游戏

描述

今天是Tabrismengxiang000来到幼儿园的第9天。

为了庆祝这美好的一天,老师组织同学们做游戏,拿来了好多骰子。

游戏规则:

1)两个人每人轮流掷骰子,操控同一个小人在一个有向的地图上走,骰子的点数是几,这个小人就向前走几格。

2) 地图只有一条路,路上有起点、终点和传送阵。传送阵会只能传送到最近接终点的另一个传送阵的位置上,否则传送阵势不会发动。

3)只要路过传送阵就会被传送走、并继续走完应走的步数,一个传送阵作为入口或出口只能使用一次。

4)小人到达终点时最后一个掷骰子的人获胜,且游戏结束。

Tabrismengxiang000这两个傻孩子,并没有弄懂规则,就在一边轮流掷骰子玩了。

现在给你这张地图,和Tabrismengxiang000总共掷骰子的次数与每次骰子的点数,你知道他俩应该谁赢么?(Tabris先掷骰子)

为了简化问题,‘S’代表起点、‘E’代表终点、‘@’代表传送阵、‘.’代表普通作为路的格子。

输入描述

本题有T组数据
每组数据第一行有一行字符串代表地图。
第二行包含一个整数N,代表Tabris与mengxiang000总共掷骰子的次数。
第三行帮扩N个整数a_i ,代表每次的点数。
1≤地图长度≤10000
1≤T≤200
1≤N≤200
1≤a_i≤6

输出描述

如果小人到达终点,输出赢家的名字,否则输出None。

示例1

输入:

2
S...@.....@....E
3
6 6 6
S..@..E
3
6 6 6

输出:

mengxiang000
Tabris

说明:

从传送门的入口进入到出口出去相当于走了一格。

对于第一组样例:

箭头所示位置为小人所在的位置

原站题解

上次编辑到这里,代码来自缓存 点击恢复默认模板

C++11(clang++ 3.9) 解法, 执行用时: 8ms, 内存消耗: 352K, 提交时间: 2019-01-26 21:26:35

#include<bits/stdc++.h>
using namespace std;
int t,n,a[210],l,pc,b,ed;
char s[10010];

void work(){
	scanf("%s",s);
	l=strlen(s);
	pc=0;
	bool yes=false;
	ed=-1;
	for(int i=l-1;i>=0;i--){
		if(s[i]=='@'){
			ed=i;
			break;
		}
	}
	scanf("%d",&n);
	for(int i=1;i<=n;i++){
		scanf("%d",&b);
		int now=(i&1)^1;
		for(int j=1;j<=b;j++){
			if(s[pc]=='@'){
				if(pc!=ed&&ed>0) pc=ed;
				else pc++;
			}
			else pc++;
			if(pc>=l-1){
				for(int iii=i+1;iii<=n;iii++) scanf("%d",&b);
				if(now==0) printf("Tabris\n");
				else printf("mengxiang000\n");
				return;
			}
		}
	}
	printf("None\n");
}

int main(){
	scanf("%d",&t);
	while(t--){
		work();
	}
	
	return 0;
}

上一题