现在的位置: 首页 > 综合 > 正文

POJ 1704 StaircaseNim

2017年10月17日 ⁄ 综合 ⁄ 共 1276字 ⁄ 字号 评论关闭

把相邻的两个棋子间的空隙看成一堆石子,当一对石子间没有空隙时视为相应堆数的石子被取完,考虑奇数个时要把最左边的等效出一个棋子来配成偶数个,然后转化成Nim游戏求解

//POJ-1704.cpp
#include <cstdio>
#include <cstring>
#include <cmath>
#include <cstdlib>
#include <ctime>
#include <climits>
#include <cctype>
#include <algorithm>
#include <iostream>
#include <string>
#include <stack>
#include <map>
#include <set>
#include <queue>
#include <utility>
#include <vector>
#include <bitset>
#include <functional>
using namespace std;
//const double pai = acos(-1.0);
const double pai = 3.14159265358979323846;
const int INF = 0x3f3f3f3f;
typedef long long love_live;
int arr[1117], pos[1117];

bool cmp(int a, int b){
    return a > b;
}

void init(){
    memset(arr, 0, sizeof(arr));
    memset(pos, 0, sizeof(pos));
    return ;
}


int main(int argc, char const *argv[]) {
#ifndef ONLINE_JUDGE
//    freopen("output", "w", stdout);
    freopen("input", "r", stdin);
#endif
    int n, m, i, j, k;
    int t, p;
    while(scanf("%d", &t) != EOF){
        while(t--){
            scanf("%d", &n);
            init();
            for(i = 0; i < n; ++i){
                scanf("%d", &pos[i]);
            }
            sort(pos, pos + n, cmp);
            // for(i = 0; i < n; i++){
            //     cout << pos[i] << " ";
            // }
            // cout << endl;
            k = 0;
            if(n % 2 == 0){
                for(i = 0; i < n; i += 2){
                    arr[k++] = pos[i] - pos[i + 1] - 1;
                }
                k--;
            }
            else{
                pos[n + 1] = 0;
                for(i = 0; i < n; i+= 2){
                    arr[k++] = pos[i] - pos[i + 1] - 1;
                }
                k--;
            }
            // for(i = 0; i <= k; i++){
            //     cout << arr[i] << " ";
            // }
            // cout << endl;
            int ans = 0;
            for(i = 0; i <= k; ++i){
                ans ^= arr[i];
            }
            // cout << ans << endl;
            if(ans == 0){
                printf("Bob will win\n");
            }
            else{
                printf("Georgia will win\n");
            }
        }
    }
return 0;
}

抱歉!评论已关闭.