poj1143 Number Game

来源:互联网 发布:linux sort命令 性能 编辑:程序博客网 时间:2024/06/10 12:59

发帖纪念我想了一整天的题,从早上到晚上现在微笑

#include<cstdio>#include<algorithm>#include<cstring>#include<algorithm>#include<iostream>#include<climits>using namespace std;int dp[1<<19];int dfs(int state){    if(dp[state]>=0)return dp[state];    for(int i=0;i<19;i++)    {        if(state>>i&1)        {            int state2=state&~(1<<i);            for(int j=i+1;j<19;j++)            {                if(state2>>j&1)                {                        int dan=(j+2)-(i+2);                        //if((dan==0)||(dan!=1&&(state2>>(dan-2))==0))                        if(dan!=1)                        {                            int flag=(state2>>(dan-2))&1;                            if(flag==0)                            state2=state2&~(1<<j);                        }                }                //printf("%d\n",state2);            }            if(dfs(state2)>=0)            {                if(dp[state2]==0)                {                    dp[state]=1;                    return dp[state];                }                //else continue;            }        }    }    dp[state]=0;    return dp[state];}int main(){    int n;    int num=1;    memset(dp,-1,sizeof(dp));    dp[0]=0;    while(~scanf("%d",&n))    {        int w[30];        int sum=0;        if(n==0)break;        int state=0;        for(int i=0;i<n;i++)        {            int a;            scanf("%d",&a);            state=state|1<<(a-2);        }        for(int i=0;i<19;i++)        {            if(state>>i&1)            {                int state2=state&~(1<<i);                for(int j=i+1;j<19;j++)                {                    if(state2>>j&1)                    {                        //printf("%d\n",j);                        int dan=(j+2)-(i+2);                        //printf("%d\n",dan);                        //if(dan==0||(dan!=1&&(state2>>(dan-2))==0))                        if(dan!=1)                        {                            int flag=(state2>>(dan-2))&1;                            if(flag==0)                                {                                    //printf("%d\n",state2);                                    state2=state2&~(1<<j);                                }                           // printf("%d\n",state2);                        }                    }                }                //printf("%d\n",state2);                if(dfs(state2)==0)w[sum++]=i+2;                //printf("%d %d\n",state2,dp[state2]);            }        }        //printf("%d\n",dp[2]);        if(sum==0)        {            printf("Test Case #%d\n",num++);            printf("There's no winning move.\n\n");        }        else        {            printf("Test Case #%d\n",num++);            printf("The winning moves are: ");            sort(w,w+sum);            for(int i=0;i<sum;i++)            {                printf("%d",w[i]);                if(i==sum-1)printf("\n\n");                else printf(" ");            }        }    }    return 0;}


0 0
原创粉丝点击