[关闭]
@994495jj 2017-05-31T11:45:22.000000Z 字数 1117 阅读 899

codeforces 786A Berzerk

(ACM)数学----博弈论 (ACM)BFS



题意

题解

代码

  1. #include<cstdio>
  2. #include<queue>
  3. #include<cstring>
  4. using namespace std;
  5. #define mp make_pair
  6. const int N=7005;
  7. queue<pair<int,int> > q;
  8. int k[2],a[2][N],f[2][N],deg[2][N];
  9. void print(int x) {
  10. if(x==1) printf("Win ");
  11. else if(x==0) printf("Lose ");
  12. else printf("Loop ");
  13. }
  14. int main() {
  15. int n;
  16. while(~scanf("%d",&n)) {
  17. ///init
  18. memset(f,-1,sizeof(f));
  19. int tt=q.size();
  20. while(tt--) q.pop();
  21. ///read
  22. scanf("%d",&k[0]);
  23. for(int i=1;i<=k[0];++i) scanf("%d",&a[0][i]);
  24. scanf("%d",&k[1]);
  25. for(int i=1;i<=k[1];++i) scanf("%d",&a[1][i]);
  26. ///get deg
  27. for(int i=0;i<n;++i) deg[0][i]=k[0];
  28. for(int i=0;i<n;++i) deg[1][i]=k[1];
  29. ///bfs
  30. f[0][n-1]=f[1][n-1]=0;
  31. q.push(mp(0,n-1));
  32. q.push(mp(1,n-1));
  33. while(!q.empty()) {
  34. int now=q.front().first;
  35. int pos=q.front().second;
  36. q.pop();
  37. int prn=1-now;
  38. for(int i=1;i<=k[prn];++i) {
  39. int prp=(pos-a[prn][i]+n)%n;
  40. if(f[prn][prp]!=-1) continue;
  41. if(f[now][pos]) {
  42. --deg[prn][prp];
  43. if(deg[prn][prp]==0) {
  44. f[prn][prp]=0;
  45. q.push(mp(prn,prp));
  46. }
  47. } else {
  48. f[prn][prp]=1;
  49. q.push(mp(prn,prp));
  50. }
  51. }
  52. }
  53. ///print
  54. for(int i=0;i<=1;++i) {
  55. for(int j=0;j<n-1;++j) {
  56. print(f[i][j]);
  57. }
  58. puts("");
  59. }
  60. }
  61. return 0;
  62. }
添加新批注
在作者公开此批注前,只有你和作者可见。
回复批注