Codeforces 786ABerzerk(博弈)
生活随笔
收集整理的這篇文章主要介紹了
Codeforces 786ABerzerk(博弈)
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
題目鏈接
很明顯的博弈題目,但是昨天打比賽的時候就是一直想不出來,一直在糾結這個loop的情況到底要怎么定義,感覺到深深的挫敗感,自己之前專門看了一段時間博弈也沒有任何用處= =太菜了
今天看了一下題解,發現思路其實還是很簡單的,對于每個點都有兩種狀態,a推到這里和b推到這里,我們可以知道,對于1這個位置,無論哪個人在面臨這樣的局面時,都是必敗態,我們從這個點出發,如果這個點是必敗態(0),那么對于所有能一步走到這個點的位置,都有必勝態;對于每個狀態,只有當它的后續狀態都為1時,這個點為必敗態,所以我們可以從1出發,對于每個能走到這個點的狀態本身進行一個數量的統計,如果這個num=它的可操作步數,就說明這個點為必敗態。
我們可以通過bfs來解決。
#include <bits/stdc++.h> using namespace std; const double eps = 1e-6; const double pi = acos(-1.0); const int INF = 0x3f3f3f3f; const int MOD = 1000000007; #define ll long long #define CL(a) memset(a,0,sizeof(a)) #define maxn 7010 #define mod 2520 int dp[2][maxn],num[2][maxn]; int n; vector<int> v[2];void bfs() {queue<pair<int,int> > que;que.push(make_pair(0,0));que.push(make_pair(1,0));while(!que.empty()){int p=que.front().first;int pos=que.front().second;int x=dp[p][pos];que.pop();if(x==0){for(int i=0; i<v[!p].size(); i++){int nxt=(pos-v[!p][i]+n)%n;if(dp[!p][nxt]==-1){dp[!p][nxt]=1;que.push(make_pair(!p,nxt));}}}else{for(int i=0; i<v[!p].size(); i++){int nxt=(pos-v[!p][i]+n)%n;if(dp[!p][nxt]!=-1) continue;if(num[!p][nxt]<v[!p].size()) num[!p][nxt]++;if(num[!p][nxt]==v[!p].size()){dp[!p][nxt]=0;que.push(make_pair(!p,nxt));}}}}}int main () {memset(dp,-1,sizeof(dp));memset(num,0,sizeof(num));cin>>n;for(int i=0; i<2; i++){int k;cin>>k;for(int j=0; j<k; j++){int m;cin>>m;v[i].push_back(m);}}dp[0][0]=dp[1][0]=0;bfs();for(int i=0; i<2; i++){for(int j=1; j<n; j++){if(dp[i][j]==0) cout<<"Lose"<<' ';else if(dp[i][j]==1) cout<<"Win"<<' ';else cout<<"Loop"<<' ';}cout<<endl;}return 0; }總結
以上是生活随笔為你收集整理的Codeforces 786ABerzerk(博弈)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: error[E0308]: Rust 闭
- 下一篇: Spring Security + OA