发帖纪念我想了一整天的题,从早上到晚上现在
#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;
}