• 游戏 博弈


    题目

    明明和亮亮在玩一个游戏。桌面上一行有n个格子,一些格子中放着棋子。明明和亮亮轮流选择如下方式中的一种移动棋子(图示中o表示棋子,*表示空着的格子):
    
    1) 当一枚棋子的右边是空格子的话,可以将这枚棋子像右移动一格。
    
    **o***         ->           ***o**
    
    2) 当一枚棋子的右边连续两个都有棋子,并且这个棋子往右边数第3格没有棋子,那么可以将这个棋子可以跳过去那两个棋子
    
    **ooo*         ->           ***oo*
    
    当任何一枚棋子到达最右边的格子时,这枚棋子自动消失。当一方不能移动时,这方输。假设明明和亮亮都采取最优策略,明明先走,谁将取胜?
    

    思路

    考虑用两种方式完成下列移动

    **ooo***       ->           ***ooo**
    

    显然第一种方式需要(1)步,第二种方式需要(3)步,多走(2)步,因为只有两个人,所以并不会影响游戏结果。所以可以把两种方式都看作第一种。

    考虑维护所有棋子到最后一个格子的距离和。此距离和是偶数则后手获胜,否则先手获胜。

    代码:

    #include<bits/stdc++.h>
    #define MaxL 1000
    using namespace std;
    int T,N;
    char S[MaxL];
    int main()
    {
    	cin>>T;
    	while(T--)
    	{
    		int Ans=0;
    		cin>>N>>S;
    		for(int i=0;i<=N-1;i++)
    			if(S[i]=='o')
    				Ans+=(N-1-i);
    		if(Ans%2==0)
    			cout<<"L"<<endl;
    		else cout<<"M"<<endl;			
    	}
    	return 0;
    } 
    
  • 相关阅读:
    剑指offer--树的子结构
    剑指offer--合并两个排序的链表
    剑指offer--链表中倒数第k个节点
    剑指offer--反转链表
    JavaScript一个简单的显示隐藏功能
    css之animition动画帧
    css之3D变换
    css之过渡、变换
    css之!important
    分栏
  • 原文地址:https://www.cnblogs.com/TaylorSwift13/p/11172452.html
Copyright © 2020-2023  润新知