zoukankan      html  css  js  c++  java
  • 游戏 博弈

    题目

    明明和亮亮在玩一个游戏。桌面上一行有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;
    } 
    
  • 相关阅读:
    状压DP
    string
    hdu3068
    HDU Stealing Harry Potter's Precious(状压BFS)
    状压BFS
    BFS+打印路径
    poj Meteor Shower
    C语言-无符号数与有符号数不为人知的秘密
    keras_实现cnn_手写数字识别
    python_plot画图参数设置
  • 原文地址:https://www.cnblogs.com/TaylorSwift13/p/11172452.html
Copyright © 2011-2022 走看看