CodeForces 786A Berzerk 博弈?BFS瞎搞

ans[i][j]

i号选手在位置j行动的结果。

预处理,将每位选手能够直接到达黑洞的点

ans[1][(n-a[1][i]+n) % n] = -1; 表示必赢的点
把这些点加入到队列,作为BFS的起点
对于必赢点,敌人能够到达必赢点的点标记ans[敌人][能到该点(必赢)的点]++;
当修改后ans[选手][点]==step_num[本选手] 表示能到的点都是敌人的必赢点,那么本点必输,加入队列。
对于必输点,敌人能够到达必输点的点是必赢点,如果没被加入到队列,那么敌人必赢点加入队列,标记为-1;

结果输出:
==-1必赢
==step_num[本选手] 必输
其余loop

  1 #include <cstdio>
  2 #include <cmath>
  3 #include <iostream>
  4 #include <cstring>
  5 #include <cmath>
  6 #include <queue>
  7 using namespace std;
  8 int a[3][11111];
  9 int ans[3][11111];
 10 struct dd
 11 {
 12     int id;
 13     int b;
 14 };
 15 queue <dd> Q;
 16 int main()
 17 {
 18     int n;
 19     int s[3];
 20     dd D;
 21     cin >> n;
 22     cin >> s[0];
 23 
 24     for (int i = 1; i <= s[0]; i++)
 25         scanf("%d", & a[0][i]);
 26     cin >> s[1];
 27     for (int i = 1; i <= s[1]; i++)
 28         scanf("%d", & a[1][i]);
 29 
 30     memset(ans, 0, sizeof(ans));
 31     for (int i = 1; i <= s[0]; i++)
 32     {
 33         ans[0][(n - a[0][i] + n) % n] = -1;
 34         D.b = 0;
 35         D.id = (n - a[0][i] + n) % n;
 36         Q.push(D);
 37     }
 38     for (int i = 1; i <= s[1]; i++)
 39     {
 40         ans[1][(n - a[1][i] + n) % n] = -1;
 41         D.b = 1;
 42         D.id = (n - a[1][i] + n) % n;
 43         Q.push(D);
 44     }
 45     while (!Q.empty())
 46     {
 47         D = Q.front();
 48         Q.pop();
 49         int b = D.b;
 50         int id = D.id;
 51         if (ans[b][id] == -1)
 52         {
 53             for (int i = 1; i <= s[!b] ; i++)
 54             {
 55                 int from = (id - a[!b][i] + n) % n;
 56 
 57                 if ((ans[!b][from] != -1) && ans[!b][from] != s[!b])
 58                 {
 59                     ans[!b][from]++;
 60                     if (ans[!b][from] == s[!b])
 61                     {
 62                         D.b = !b;
 63                         D.id = from;
 64                         Q.push(D);
 65                     }
 66                 }
 67 
 68             }
 69         }
 70         else
 71         {
 72             for (int i = 1; i <= s[!b] ; i++)
 73             {
 74                 int from = (id - a[!b][i] + n) % n;
 75                 if ((ans[!b][from] != -1) && ans[!b][from] != s[!b])
 76                 {
 77                     D.b = !b;
 78                     D.id = from;
 79                     ans[!b][from] = -1;
 80                     Q.push(D);
 81                 }
 82             }
 83         }
 84     }
 85     for (int i = 1; i < n - 1; i++)
 86         if (ans[0][i] == -1) cout << "Win" << " ";
 87         else if (ans[0][i] == s[0]) cout << "Lose" << " ";
 88         else cout << "Loop" << " ";
 89     if (ans[0][n - 1] == -1) cout << "Win" << endl;
 90     else if (ans[0][n - 1] == s[0]) cout << "Lose" << endl;
 91     else cout << "Loop" << endl;
 92     for (int i = 1; i < n - 1; i++)
 93         if (ans[1][i] == -1) cout << "Win" << " ";
 94         else if (ans[1][i] == s[1]) cout << "Lose" << " ";
 95         else cout << "Loop" << " ";
 96     if (ans[1][n - 1] == -1) cout << "Win" << endl;
 97     else if (ans[1][n - 1] == s[1]) cout << "Lose" << endl;
 98     else cout << "Loop" << endl;
 99 
100 }

 

posted @ 2017-03-24 19:27  HITLJR  阅读(424)  评论(0编辑  收藏  举报