1. 程式人生 > >無偏博弈類問題

無偏博弈類問題

cout 一個 npos 代碼 其中 無偏 har include style

無偏博弈類問題是一類任意局勢對於遊戲雙方來說都是平等的的遊戲。也就是說下一步的局勢是確定的,而與誰走沒有關系。

例題:

K大師在紙上畫了一行n個格子,要小明和他交替往其中填入字母。
1. 輪到某人填的時候,只能在某個空格中填入L或O
2. 誰先讓字母組成了“LOL”的字樣,誰獲勝。
3. 如果所有格子都填滿了,仍無法組成LOL,則平局。

小明試驗了幾次都輸了,他很慚愧,希望你能用計算機幫他解開這個謎。

本題的輸入格式為:
第一行,數字n(n<10),表示下面有n個初始局面。
接下來,n行,每行一個串,表示開始的局面。
  比如:“******”, 表示有6個空格。“L****”,   表示左邊是一個字母L,它的右邊是4個空格。

要求輸出n個數字,表示對每個局面,如果小明先填,當K大師總是用最強著法的時候,小明的最好結果。
1 表示能贏
-1 表示必輸
0 表示可以逼平
代碼如下,一個遞歸過程:
#include<iostream>
#include<cstdio>
#include<string>
using namespace std;
int judge(string s)
{
    if(s.find("LOL")!=string::npos)//如果填之前,已經出現了LOL則輸
        return -1;
    if(s.find(*)==string::npos)//如果沒有LOL並且也沒有了空格則是平局
        return 0;
    int len=s.length();
    int ping=0;
    
for(int i=0;i<len;i++) { if(s[i]==*) { s[i]=L; switch(judge(s)) { case -1:return 1;//我方填完,出現LOL case 0: ping=1; //我方填完出現平局 } s[i]=O; switch(judge(s)) {
case -1: return 1; case 0: ping=1; } s[i]=*; } } if(ping) return 0; return -1; } int main() { int n; scanf("%d",&n); getchar(); char s[30]; for(int i=0;i<n;i++) { string s; cin>>s; cout<<judge(s)<<endl; } }

關於SG函數後續

無偏博弈類問題