python算24点穷举法_24点游戏算法

~万物皆可递归~ #include 

bool s;

void cacuCheck(double num[],bool visited[],int rest){

if (rest==1) {

for (int i=0; i<4; i++)

if (!visited[i])

if (num[i]==24)

s=true;

return;

}

for (int i=0; i<4; i++) {

if (!visited[i]) {

for (int j=i+1; j<4; j++) {

if (!visited[j]) {

double a=num[i];

double b=num[j];

visited[i]=true;

visited[j]=true;

for (int k=0; k<4; k++) {

switch (k) {

case 0:

num[i]=a+b;

visited[i]=false;

cacuCheck(num, visited, rest-1);

break;

case 1:

num[i]=a-b;

visited[i]=false;

cacuCheck(num, visited, rest-1);

num[i]=b-a;

visited[i]=false;

cacuCheck(num, visited, rest-1);

break;

case 2:

num[i]=a*b;

visited[i]=false;

cacuCheck(num, visited, rest-1);

break;

case 3:

if (a!=0) {

num[i]=b/a;

visited[i]=false;

cacuCheck(num, visited, rest-1);

break;

}

if (b!=0) {

num[i]=a/b;

visited[i]=false;

cacuCheck(num, visited, rest-1);

break;

}

break;

default:

break;

}

}

num[i]=a;

num[j]=b;

visited[i]=false;

visited[j]=false;

}

}

}

}

}

int main(){

void cacuCheck(double [],bool [],int );

double num[4];

while (~scanf("%lf%lf%lf%lf",&num[0],&num[1],&num[2],&num[3])) {

bool visited[4]={false};

s=false;

//按序从列表选择两数

for (int i=0; i<4; i++) {

for (int j=i+1; j<4; j++) {

double a=num[i];

double b=num[j];

visited[i]=true;

visited[j]=true;

for (int k=0; k<4; k++) { //两数依次作加减乘除运算,结果重新填入列表中

switch (k) {

case 0:

num[i]=a+b;

visited[i]=false;

cacuCheck(num, visited, 3);

break;

case 1:

num[i]=a-b;

visited[i]=false;

cacuCheck(num, visited, 3);

num[i]=b-a;

visited[i]=false;

cacuCheck(num, visited, 3);

break;

case 2:

num[i]=a*b;

visited[i]=false;

cacuCheck(num, visited, 3);

break;

case 3:

if (a!=0) {

num[i]=b/a;

visited[i]=false;

cacuCheck(num, visited, 3);

break;

}

if (b!=0) {

num[i]=a/b;

visited[i]=false;

cacuCheck(num, visited, 3);

break;

}

break;

default:

break;

}

}

num[i]=a;

num[j]=b;

visited[i]=false;

visited[j]=false;

if (s)

break;

}

if (s)

break;

}

if (s)

printf("true\n");

else

printf("false\n");

}

return 0;

}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值