zoukankan      html  css  js  c++  java
  • uva live 12846 A Daisy Puzzle Game

    假设下一个状态有必败。那么此时状态一定是必胜,否则此时状态一定是必败


    状压DP

    #include<iostream>
    #include<map>
    #include<string>
    #include<cstring>
    #include<cstdio>
    #include<cstdlib>
    #include<cmath>
    #include<queue>
    #include<vector>
    #include<algorithm>
    using namespace std;
    int dp[1<<20];
    int n;
    int dfs(int state)
    {
    	int i,t;
    	if(state==0)//0必败 
    		return dp[0]=0;
    	if(dp[state]!=-1)//此状态已知 
    		return dp[state];
    	dp[state]=0;
    	for(i=0;i<n;i++)
    	{
    		if((state>>i)&1)//摘掉第i个花瓣 
    		{
    			t=state^(1<<i);
    			if(dfs(t)==0)
    			{
    				dp[state]=1;//此状态必胜 
    				break;
    			}
    			if(i<n-1&&((t>>(i+1))&1))//再摘掉第i+1个花瓣
    			{
    				t=t^(1<<(i+1));
    				if(dfs(t)==0)
    				{
    					dp[state]=1;//此状态必胜
    					break;
    				}
    			}
    		}
    	}
    	return dp[state];
    }
    int main()
    {
    	bool vis[30];
    	int a[30];
    	int i,T,j,k,m,t,state,cnt;
    	memset(dp,-1,sizeof(dp));
    	cin>>T;
    	for(j=1;j<=T;j++)
    	{
    		cin>>n>>m;
    		memset(vis,0,sizeof(vis));
    		while(m--)
    		{
    			cin>>t;
    			vis[t]=1;
    		}
    		cnt=0;
    		for(i=1;i<=n;i++)
    		{
    			if(!vis[i])
    				a[cnt++]=1;
    			else
    				break;
    		}
    		if(i!=n)
    		{
    			for(k=n;k>=i;k--)
    				if(!vis[k])
    					a[cnt++]=1;
    				else
    					a[cnt++]=0;
    		}
    		state=0;
    		for(i=0;i<cnt;i++)
    			state+=a[i]*(1<<(cnt-i-1));//生成初始状态 
    		n=cnt;
    		if(dfs(state))
    			printf("Case %d: yes
    ",j);
    		else
    			printf("Case %d: no
    ",j);
    	}
    	return 0;
    }


    12846 A Daisy Puzzle Game
    Little Gretchen playing the Daisy game
    Gretchen, a little peasant girl from the Swiss Alps, is an expert
    at the Daisy game, a simple game that is very well-known
    around the country. Two players pluck of the petals of a Daisy
    fower, and each player is always at liberty to pluck a single
    petal or any two contiguous ones, so that the game would
    continue by singles or doubles until the victorious one takes
    the last leaf and leaves the “stump”—called the “old maid”—
    to the opponent.
    The pretty mädchen has mastered the Daisy game to such
    an extent that she always plays optimally. In other words, she
    always plays by performing the best possible moves on each
    turn, a feat which never fails to astonish tourists who dare to
    challenge her to a game.
    Analyzing the game, it is not very complicated to fgure out a winning strategy for the second player,
    as long as the game starts with a complete fower (having all of its petals intact). However, what will
    happen when Gretchen plays against an opponent that also plays optimally, and some of the fower’s
    petals have been plucked of at random?
    A fower is described by a number N which represents the original number of petals of the fower,
    and a list of the petals that have been plucked of. All petals are numbered from 1 to N, and given the
    circular nature of the fower, that means petals 1 and N are originally adjacent.
    Given the description of a fower, and assuming it’s Gretchen’s turn, will she win the game? Remember
    that both players always play optimally.
    Input
    Input starts with a positive integer T, that denotes the number of test cases.
    Each test case begins with two integers in a single line, N and M, representing the number of petals
    originally in the fower, and the number of petals that have been plucked of, respectively.
    The next line contains M distinct integers, representing the petals that have been plucked of. These
    numbers will always be in ascending order.
    T<=  5000; 3<=  N<=  20; 1 <= M < N
    Output
    For each test case, print the case number, followed by the string ‘yes’ if Gretchen wins the game, or
    ‘no’ otherwise.

    Sample Input
    2
    13 1
    7

    5 3
    1 3 4
    Sample Output
    Case 1: yes
    Case 2: no

  • 相关阅读:
    c#与JavaScript实现对用户名、密码进行RSA非对称加密
    NPOI操作EXCEL(五)——含合并单元格复杂表头的EXCEL解析
    NPOI操作EXCEL(四)——反射机制批量导出excel文件
    NPOI操作EXCEL(三)——反射机制进行excel表格数据的解析
    NPOI操作EXCEL(二)——大量不同模板时设计方式
    由一个投票算法引发的思考
    .NET WebAPI 实现图片上传(包括附带参数上传图片)
    .NET WebAPI 用ExceptionFilterAttribute实现错误(异常)日志的记录(log4net做写库操作)
    .NET WebAPI 用ActionFilterAttribute实现token令牌验证与对Action的权限控制
    js中的console
  • 原文地址:https://www.cnblogs.com/mfmdaoyou/p/7205094.html
Copyright © 2011-2022 走看看