谁能搞定扑克24点的问题?或提供思路!

jiyifi 2002-03-24 09:07:45
谁能搞定扑克24点的问题?
...全文
33 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
ndsm 2002-03-30
  • 打赏
  • 举报
回复
我说一句gois(gois) 不要生气:
3,7,9,7你的程序就不会算了,希望你再改一下
jiyifi 2002-03-30
  • 打赏
  • 举报
回复
gois(gois) 的代码要做一些改进要好点,还是很谢谢你 :)
goddamnit 2002-03-25
  • 打赏
  • 举报
回复
请问一下楼上的大哥:那个itoa是什么函数,是包含在那个头文件里的。请稍作解释,谢谢!!
LeeMaRS 2002-03-24
  • 打赏
  • 举报
回复
呵呵.海星同志这个代码抢了不少分了.^^
starfish 2002-03-24
  • 打赏
  • 举报
回复
嘿嘿,不好意思,偶要和你抢分:)
算法思路是:每次从剩余的数中取出两个合并(可以用加减乘除四种方式和并),然后在剩下的数中再取两个再合并,……如此反复,直到所有的数都被取尽。

#include <iostream>
#include <string>
#include <cmath>

using namespace std;

const double PRECISION = 1E-6;
const int COUNT_OF_NUMBER = 4;
const int NUMBER_TO_BE_CAL = 24;

double number[COUNT_OF_NUMBER];
string expression[COUNT_OF_NUMBER];

bool Search(int n)
{
if (n == 1) {
if ( fabs(number[0] - NUMBER_TO_BE_CAL) < PRECISION ) {
cout << expression[0] << endl;
return true;
} else {
return false;
}
}

for (int i = 0; i < n; i++) {
for (int j = i + 1; j < n; j++) {
double a, b;
string expa, expb;

a = number[i];
b = number[j];
number[j] = number[n - 1];

expa = expression[i];
expb = expression[j];
expression[j] = expression[n - 1];

expression[i] = '(' + expa + '+' + expb + ')';
number[i] = a + b;
if ( Search(n - 1) ) return true;

expression[i] = '(' + expa + '-' + expb + ')';
number[i] = a - b;
if ( Search(n - 1) ) return true;

expression[i] = '(' + expb + '-' + expa + ')';
number[i] = b - a;
if ( Search(n - 1) ) return true;


expression[i] = '(' + expa + '*' + expb + ')';
number[i] = a * b;
if ( Search(n - 1) ) return true;

if (b != 0) {
expression[i] = '(' + expa + '/' + expb + ')';
number[i] = a / b;
if ( Search(n - 1) ) return true;
}
if (a != 0) {
expression[i] = '(' + expb + '/' + expa + ')';
number[i] = b / a;
if ( Search(n - 1) ) return true;
}

number[i] = a;
number[j] = b;
expression[i] = expa;
expression[j] = expb;
}
}
return false;
}

void main()
{
for (int i = 0; i < COUNT_OF_NUMBER; i++) {
char buffer[20];
int x;
cin >> x;
number[i] = x;
itoa(x, buffer, 10);
expression[i] = buffer;
}

if ( Search(COUNT_OF_NUMBER) ) {
cout << "Success." << endl;
} else {
cout << "Fail." << endl;
}
}
gois 2002-03-24
  • 打赏
  • 举报
回复
这个100分我拿定了,以下是我的源代码:
#include<stdio.h>
#include<stdlib.h>
#include<time.h>
#include<math.h>
#define LYF 10E+8
void getprintnumber(float f[]){
int i;
time_t t;
srand((unsigned)time(&t));
for(i=0;i<4;i++){
f[i]=(float)(rand()%10);
if(f[i]==0.0)
f[i]=10.0;
printf("%d ",(int)f[i]);
}
}
float opt(float a,float b,int operate){
switch(operate){
case 0:
return a+b;
case 1:
return a-b;
case 2:
return a*b;
case 3:
return b==0.0?LYF:a/b;
}
}
void judge(float f[]){
float a,b,c,d;
char s[]={'+','-','*','/'};
int i,j1,j2,j3;
int g[]={0,1,2,3,0,1,3,2,0,2,1,3,0,2,3,1,0,3,1,2,0,3,2,1,
1,0,2,3,1,0,3,2,1,2,0,3,1,2,3,0,1,3,0,2,1,3,2,0,
2,0,1,3,2,0,3,1,2,1,0,3,2,1,3,0,2,3,0,1,2,3,1,0,
3,0,1,2,3,0,2,1,3,1,0,2,3,1,2,0,3,2,0,1,3,2,1,0};
putchar(10);
for(i=0;i<24;i++){
a=f[g[4*i]];
b=f[g[4*i+1]];
c=f[g[4*i+2]];
d=f[g[4*i+3]];
for(j1=0;j1<4;j1++)
for(j2=0;j2<4;j2++)
for(j3=0;j3<4;j3++)
if(fabs(opt(opt(opt(a,b,j1),c,j2),d,j3)-24)<10.0/LYF){
if(j3==0||j3==1){
printf("(%d%c%d)%c%d%c%d=24\n\t\tOK.",
(int)a,s[j1],(int)b,s[j2],(int)c,s[j3],(int)d);
exit(0);
}
if(j1==2||j1==3){
printf("(%d%c%d%c%d)%c%d=24\n\t\tOK.",
(int)a,s[j1],(int)b,s[j2],(int)c,s[j3],(int)d);
exit(0);
}
else{
printf("((%d%c%d)%c%d)%c%d=24\n\t\tOK.",
(int)a,s[j1],(int)b,s[j2],(int)c,s[j3],(int)d);
exit(0);
}
}
else
if(fabs(opt(opt(a,b,j1),opt(c,d,j2),j3)-24)<10.0/LYF){
if((j3==0||j3==1)&&(j1==2||j1==3)&&(j2==2||j2==3)){
printf("%d%c%d%c%d%c%d=24\n\t\tOK.",
(int)a,s[j1],(int)b,s[j3],(int)c,s[j2],(int)d);
exit(0);
}
else{
printf("(%d%c%d)%c(%d%c%d)=24\n\t\tOK.",
(int)a,s[j1],(int)b,s[j3],(int)c,s[j2],(int)d);
exit(0);
}
}
}
printf("\t\tNo solution!");
}
main(){
float f[4];
getprintnumber(f);
printf("\nPress Enter key to continue...");
getchar();
judge(f);
}


给分吧,上帝!

33,006

社区成员

发帖
与我相关
我的任务
社区描述
数据结构与算法相关内容讨论专区
社区管理员
  • 数据结构与算法社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧