NC14539. 做游戏
描述
为了庆祝这美好的一天,老师组织同学们做游戏,拿来了好多骰子。
游戏规则:
1)两个人每人轮流掷骰子,操控同一个小人在一个有向的地图上走,骰子的点数是几,这个小人就向前走几格。
2) 地图只有一条路,路上有起点、终点和传送阵。传送阵会只能传送到最近接终点的另一个传送阵的位置上,否则传送阵势不会发动。
3)只要路过传送阵就会被传送走、并继续走完应走的步数,一个传送阵作为入口或出口只能使用一次。
4)小人到达终点时最后一个掷骰子的人获胜,且游戏结束。
Tabris与mengxiang000这两个傻孩子,并没有弄懂规则,就在一边轮流掷骰子玩了。
现在给你这张地图,和Tabris与mengxiang000总共掷骰子的次数与每次骰子的点数,你知道他俩应该谁赢么?(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; }