生活随笔
收集整理的這篇文章主要介紹了
【codeforces 787C】Berzerk
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
【題目鏈接】:http://codeforces.com/contest/787/problem/C
【題意】
給你怪物一開始所在的位置;
然后兩人輪流操作;
可以選擇讓這個怪物前進自己的集合里面所擁有的數字所代表的步數;
對于2..n這些怪物的起點以及誰先進行游戲這些信息;
讓這個怪物到位置1的人贏
判斷誰能贏,輸,或者游戲一直循環下去
【題解】
設f[i][j]表示i先玩,然后怪物一開始的位置為j的結果;
則
//-2表示輸,-1表示贏,0表示不確定
f[1][1]=f[2][1]=-2;
即如果誰面臨了怪物到達了1這個位置這個狀態,他就輸了;
因為這表示對方已經完成游戲了;
這樣就代表先手輸了;
然后對于這些為-2的狀態;
可以往前推前一個人的狀態;
即
前一個人,他走一步(通過自己集合里面的步數)到達了-2的狀態;
也就是說讓對方面臨了先手輸的狀態,本來你是先手,然后你走一步,對方就變成先手啦,那么對方面臨了先手輸的狀態,那么你就贏了;
因此對于所有能夠走到-2的狀態;
置其狀態為先手贏;
然后再去找那些;
無論用集合里面哪個元素走,都會讓對方面臨先手贏狀態的狀態;
這些狀態,置它們為先手輸;
因為它們無論怎么走,對方都能面對先手贏的狀態;
然后對于其他的狀態,都是不確定.
寫個倒推就好;
具體看代碼
【完整代碼】
#include <bits/stdc++.h>
using namespace std;
#define lson l,m,rt<<1
#define rson m+1,r,rt<<1|1
#define LL long long
#define rep1(i,a,b) for (int i = a;i <= b;i++)
#define rep2(i,a,b) for (int i = a;i >= b;i--)
#define mp make_pair
#define pb push_back
#define fi first
#define se second
#define rei(x) scanf("%d",&x)
#define rel(x) scanf("%lld",&x)
#define ref(x) scanf("%lf",&x)typedef pair<
int,
int> pii;
typedef pair<LL,LL> pll;
const int dx[
9] = {
0,
1,-
1,
0,
0,-
1,-
1,
1,
1};
const int dy[
9] = {
0,
0,
0,-
1,
1,-
1,
1,-
1,
1};
const double pi =
acos(-
1.0);
const int N =
7e3+
100;
int k[
3],n;
int s[
3][N];
int g[
3][N];
queue <pii> dl;
void in()
{rei(n);rep1(i,
1,
2){rei(k[i]);rep1(j,
1,k[i])rei(s[i][j]);}
}
void get_ans()
{dl.push(mp(
1,
1)),dl.push(mp(
2,
1));g[
1][
1] = -
2,g[
2][
1] = -
2;
while (!dl.empty()){
int f = dl.front().fi,x = dl.front().se;
int nex =
3-f;dl.pop();rep1(i,
1,k[nex]){
int y = x-s[nex][i];
if (y<=
0)y+=n;
if (g[f][x]==-
2){
if (g[nex][y]!=-
1){g[nex][y] = -
1;dl.push(mp(nex,y));}}
else{
if (g[nex][y]<
0)
continue;g[nex][y]++;
if (g[nex][y]==k[nex]){g[nex][y] = -
2;dl.push(mp(nex,y));}}}}
}
void o()
{rep1(i,
2,n){
if (g[
1][i]==-
2)
printf(
"Lose");
elseif (g[
1][i]==-
1)
printf(
"Win");
elseprintf(
"Loop");
if (i==n)
puts(
"");
elseputchar(
' ');}rep1(i,
2,n){
if (g[
2][i]==-
2)
printf(
"Lose");
elseif (g[
2][i]==-
1)
printf(
"Win");
elseprintf(
"Loop");
if (i==n)
puts(
"");
elseputchar(
' ');}
}
int main()
{in();get_ans();o();
return 0;
}
轉載于:https://www.cnblogs.com/AWCXV/p/7626533.html
總結
以上是生活随笔為你收集整理的【codeforces 787C】Berzerk的全部內容,希望文章能夠幫你解決所遇到的問題。
如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。