- 1
- #include
- 2
- #include
- 3
- #include <
- string
- .h>
- 4
- #include
- 5 using namespace std;
- 6
- 7 const int
- MAXN = 7e3 +
- 10;
- 8 int
- gel[
- 2
- ][MAXN], vis[
- 2
- ][MAXN], num[
- 2
- ][MAXN], k[
- 2];
- 9 int n;
- 10
- 11 void
- bfs(
- void){
- 12
- queue
- int
- ,
- int
- > >
- q;
- 13
- q.push({
- 0
- ,
- 0});
- 14
- q.push({
- 1
- ,
- 0});
- 15
- vis[
- 0
- ][
- 0
- ] =
- 0;
- 16
- vis[
- 1
- ][
- 0
- ] =
- 0;
- 17 while
- (!
- q.empty()){
- 18
- pair<
- int
- ,
- int
- > cnt =
- q.front();
- 19 int
- id = cnt.first, x =
- cnt.second;
- 20 q.pop();
- 21 if
- (vis[id][x] ==
- 0){
- 22 for
- (
- int
- i =
- 0
- ; i < k[!id]; i++
- ){
- 23 int
- tmp = (x - gel[!id][i] + n) %
- n;
- 24 if
- (vis[!id][tmp] == -
- 1){
- 25
- vis[!id][tmp] =
- 1;
- 26
- q.push({!
- id, tmp});
- 27 }
- 28 }
- 29
- }
- else if
- (vis[id][x] ==
- 1){
- 30 for
- (
- int
- i =
- 0
- ; i < k[!id]; i++
- ){
- 31 int
- tmp = (x - gel[!id][i] + n) %
- n;
- 32 if
- (vis[!id][tmp] == -
- 1){
- 33 if
- (++num[!id][tmp] == k[!id]){
- //累计邻接(!id, tmp)状态的必胜态
- 34
- vis[!id][tmp] =
- 0;
- 35
- q.push({!
- id, tmp});
- 36 }
- 37 }
- 38 }
- 39 }
- 40 }
- 41 }
- 42
- 43 int
- main(
- void){
- 44
- scanf(
- "%d"
- , &
- n);
- 45 for
- (
- int
- i =
- 0
- ; i <
- 2
- ; i++
- ){
- 46
- scanf(
- "%d"
- , &
- k[i]);
- 47 for
- (
- int
- j =
- 0
- ; j < k[i]; j++
- ){
- 48
- scanf(
- "%d"
- , &
- gel[i][j]);
- 49 }
- 50 }
- 51
- memset(vis, -
- 1
- ,
- sizeof(vis));
- 52 bfs();
- 53 for
- (
- int
- i =
- 0
- ; i <
- 2
- ; i++
- ){
- 54 for
- (
- int
- j =
- 1
- ; j < n; j++
- ){
- 55 if
- (vis[i][j] == -
- 1
- ) printf(
- "Loop ");
- 56 else if
- (vis[i][j]) printf(
- "Win ");
- 57 else
- printf(
- "Lose ");
- 58 }
- 59
- puts(
- "");
- 60 }
- 61 return 0;
- 62
- }
来源: http://www.bubuko.com/infodetail-2164829.html