模拟就行,要注意的地方就是,加入当前的操作数比这个人手里的卡片数少,那直接结束,这个人就是下一个该操作的人,如果当前操作序列空了,但是这个人正好有0张卡牌,那也继续的,因为这个人会被跳过判断,直到下一个手里有牌的人为止
简单说,下一个位置就是,假如当前剩余操作数为x,那个人手里有y张卡牌,就是x<y的那个人
#include <cstdio>
#include <cstring>
#include <vector>
#include <iostream>
#include <string>
#include <cmath>
#include <algorithm>
#include <set>
#include <map>
#include <queue>
using namespace std;
#define ll long long
#define mod 1000000009
#define maxn 105
#define maxm 10003
#define INF 0x3f3f3f3f
int N;
char s0[100005];
int player[12];
bool work(int id, char op)
{
if (op == '.')
return false;
if (op == 'L')
{
player[id]--;
int x = id + 1;
if (x > N)
x -= N;
player[x]++;
}
else if (op == 'R')
{
player[id]--;
int x = id - 1;
if (x <= 0)
x += N;
player[x]++;
}
else
{
player[id]--;
player[0]++;
}
int sum = 0;
for (int i = 1; i <= N; ++i)
{
if (player[i] > 0)
++sum;
}
if (sum <= 1)
return true;
else
return false;
}
int main()
{
//freopen("input.txt", "r", stdin);
int kase = 1;
while (scanf("%d",&N)!=EOF)
{
if (N == 0)
break;
scanf("%s", s0);
if (kase > 1)
{
printf("\n");
}
printf("Game %d:\n", kase);
++kase;
if (N == 1)
{
printf("Player 1:3(W)\nCenter:0\n");
continue;
}
player[0] = 0;
for (int i = 1; i <= N; ++i)
player[i] = 3;
int len = strlen(s0);
int id = 0;
int pos = 0;
bool win = false;
while (1)
{
int cnt = player[id];
if (cnt > 3)
cnt = 3;
if (cnt > len - pos)
{
break;
}
for (int i = 0; i < cnt; ++i)
{
if (work(id, s0[pos++]))
{
win = true;
break;
}
}
if (win)
break;
id++;
if (id > N)
id -= N;
}
if (win)
{
for (int i = 1; i <= N; ++i)
{
if (player[i] > 0)
{
id = i;
break;
}
}
}
for (int i = 1; i <= N; ++i)
{
printf("Player %d:%d", i, player[i]);
if (i == id)
{
if (win)
printf("(W)");
else
printf("(*)");
}
printf("\n");
}
printf("Center:%d\n", player[0]);
}
//system("pause");
//while (1);
return 0;
}