链接:点击打开链接
题意:
有8张牌,值分别为1,1,2,2, 3,3, 4, 4
取四张牌可以玩24点游戏的选法数。
24点只能用+、-、*连接。
算法:
for循环枚举四张牌
枚举四张牌的运算顺序
再枚举符号dfs
爆搜到结果直接提交。
好遗憾啊。。。小攀攀人肉搜索,提交了11、12,就是不交13。。。。
#include<cstdio>
#include<iostream>
#include<cstring>
#include<queue>
#include<algorithm>
#include<fstream>
#include<map>
using namespace std;
int s[]={1,1,2,2,3,3,4,4};
int b[6],flag,a[6];
bool vis[10],used[6];
map<int,int> h;
int judge(int dep,int now)
{
if(dep==4)
{
if(now == 24)
return 1;
else return 0;
}
if(dep==0)
{
if(judge(dep+1,b[dep])) return 1;
}
else
{
if(judge(dep+1,now+b[dep])) return 1;
if(judge(dep+1,now-b[dep])) return 1;
if(judge(dep+1,now*b[dep])) return 1;
}
return 0;
}
void dfs(int dep) //四个数有不同的组合顺序,搜一遍
{
if(dep==4) //确定四个数的顺序后再加上符号
{
if(judge(0,0)) flag=1;
return;
}
for(int i=0;i<4;i++)
{
if(!used[i])
{
used[i]=1;
b[dep]=a[i];
dfs(dep+1);
used[i]=0;
}
}
}
int main()
{
h.clear();
int ans=0;
memset(used,0,sizeof(used));
for(int i=0;i<8;i++) //枚举
{
for(int j=0;j<8;j++)
{
for(int k=0;k<8;k++)
{
for(int l=0;l<8;l++)
{
if(i!=j && j!=k && k!=l && i!=k && i!=l && j!=l)
{
a[0]=s[i];
a[1]=s[j];
a[2]=s[k];
a[3]=s[l];
sort(a,a+4);
//cout<<a[0]<<' '<<a[1]<<' '<<a[2]<<' '<<a[3]<<endl;
int sss = 0;
for(int i=0;i<4;i++) //hash判重
sss=sss*10+a[i];
if(!h[sss])
{
h[sss]=1;
flag=0;
dfs(0);
ans+=flag;
}
}
}
}
}
}
printf("%d\n",ans);
return 0;
}