| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 2360 人关注过本帖
标题:[原创]计算24点c++源代码,大家帮我看看怎么改进。。
只看楼主 加入收藏
yuki
Rank: 2
等 级:新手上路
威 望:5
帖 子:508
专家分:0
注 册:2005-2-4
收藏
 问题点数:0 回复次数:15 
[原创]计算24点c++源代码,大家帮我看看怎么改进。。

#include <iostream> #include <vector> #include <cmath> #include <algorithm>

using namespace std;

const double epsilon = 1E-14; const double destination = 24;

const double CARD_VALUE_MIN = 1; const double CARD_VALUE_MAX = 13;

const char symbol_array[] = {'+','-','*','/'};

double max(const double a,const double b); bool approx_equal(const double a,const double b); double calc_each(const double a,const double b,const int method);

void insert_element(vector<double> &v,const int pos,const double value); bool print_formule(const vector<double> &v,const int formule_id,const int symb_a, const int symb_b,const int symb_c);

void calc_elements(const vector<double> &v); void calc_permutation(vector<double> queue,vector<double> to_permute); //只有对于没有重复的数组才能产生正确的全排列 void calc_permutation_standard(vector<double> queue);

int rcount = 0;

int main(int argc,char *argv[]) { if(argc < 5) { cout << "Calc point 24 verstion 0.1" << endl; cout << "Usage: " << argv[0] << " <card1> <card2> <card3> <card4> " << endl; return 1; } else { vector<double> card(4); vector<double> helper(1);

for(int i = 0; i < 4; i++) { card[i] = atof(argv[i+1]); if(card[i] < CARD_VALUE_MIN || card[i] > CARD_VALUE_MAX) { cout << "Invailed value of card!" << endl; return 1; } } /*if(card[0] == card[1] && card[0] == card[2] && card[0] == card[3]) calc_elements(card); else { calc_elements(card); calc_permutation(card,helper); }*/ calc_permutation_standard(card); cout << "The total result is " << rcount << endl; } return 0; }

double max(const double a,const double b) { return a > b ? a : b; }

bool approx_equal(const double a,const double b) { if(a == 0) return fabs(b) <= epsilon; if(b == 0) return fabs(a) <= epsilon;

return fabs(a - b) / max(fabs(a),fabs(b)) <= epsilon; }

double calc_each(const double a,const double b,const int method) { if(method == 0) return a + b; if(method == 1) return a - b; if(method == 2) return a * b; if(method == 3 && b != 0) return a / b; return -999; }

void insert_element(vector<double> &v,const int pos,const double value) { v.push_back(0);

for(int i = v.size() - 2; i >= pos; i--) v[i+1] = v[i]; v[pos] = value; }

bool print_formule(const vector<double> &v,const int formule_id,const int symb_a, const int symb_b,const int symb_c) { double r1,r2,result = 0;

if(formule_id == 0) { r1 = calc_each(v[0],v[1],symb_a); if(approx_equal(r1,-999)) return false; r2 = calc_each(r1,v[2],symb_b); if(approx_equal(r2,-999)) return false; result = calc_each(r2,v[3],symb_c); } else if(formule_id == 1) { r1 = calc_each(v[0],v[1],symb_a); if(approx_equal(r1,-999)) return false; r2 = calc_each(v[2],v[3],symb_b);//symb_c); if(approx_equal(r2,-999)) return false; result = calc_each(r1,r2,symb_c);//symb_b); } else if(formule_id == 2) { r1 = calc_each(v[1],v[2],symb_a);//symb_b); if(approx_equal(r1,-999)) return false; r2 = calc_each(v[0],r1,symb_b);//symb_a); if(approx_equal(r2,-999)) return false; result = calc_each(r2,v[3],symb_c); } else if(formule_id == 3) { r1 = calc_each(v[1],v[2],symb_a);//symb_b); if(approx_equal(r1,-999)) return false; r2 = calc_each(r1,v[3],symb_b);//symb_c); if(approx_equal(r2,-999)) return false; result = calc_each(v[0],r2,symb_c);//symb_a); } else if(formule_id == 4) { r1 = calc_each(v[2],v[3],symb_a);//symb_c); if(approx_equal(r1,-999)) return false; r2 = calc_each(v[1],r1,symb_b);//symb_b); if(approx_equal(r2,-999)) return false; result = calc_each(v[0],r2,symb_c);//symb_a); } if(approx_equal(result,-999)) return false;

if(approx_equal(result,destination)) { if(formule_id == 0) { cout << "((" << v[0] << symbol_array[symb_a] << v[1] << ")" << symbol_array[symb_b] << v[2] << ")" << symbol_array[symb_c] << v[3] << "=" << destination << endl; return true; } else if(formule_id == 1) { cout << "(" << v[0] << symbol_array[symb_a] << v[1] << ")" << symbol_array[symb_b] << "(" << v[2] << symbol_array[symb_c] << v[3] << ")=" << destination << endl; return true; } else if(formule_id == 2) { cout << "(" << v[0] << symbol_array[symb_a] << "(" << v[1] << symbol_array[symb_b] << v[2] << "))" << symbol_array[symb_c] << v[3] << "=" << destination << endl; return true; } else if(formule_id == 3) { cout << v[0] << symbol_array[symb_a] << "((" << v[1] << symbol_array[symb_b] << v[2] << ")" << symbol_array[symb_c] << v[3] << ")=" << destination << endl; return true; } else if(formule_id == 4) { cout << v[0] << symbol_array[symb_a] << "(" << v[1] << symbol_array[symb_b] << "(" << v[2] << symbol_array[symb_c] << v[3] << "))=" << destination << endl; return true; } } return false; }

void calc_elements(const vector<double> &v) { int i,j,k,l; for(l = 0; l < 5; l++) { for(i = 0; i < 4; i++) { for(j = 0; j < 4; j++) { for(k = 0; k < 4; k++) { if(print_formule(v,l,i,j,k)) { rcount++; } } } } } }

void calc_permutation(vector<double> queue,vector<double> to_permute) { if(queue.size() == 0) { to_permute.pop_back(); calc_elements(to_permute); } else { vector<double> mir_queue = queue; vector<double> mir_to_permute = to_permute; vector<double> bak_vector;

double back_value = mir_queue[mir_queue.size() - 1];

mir_queue.pop_back();

for(int i = 0; i < mir_to_permute.size(); i++) { bak_vector = mir_to_permute; insert_element(mir_to_permute,i,back_value); calc_permutation(mir_queue,mir_to_permute); mir_to_permute = bak_vector; } } }

void calc_permutation_standard(vector<double> queue) { sort(queue.begin(),queue.end()); calc_elements(queue);

while(next_permutation(queue.begin(),queue.end())) { calc_elements(queue); } }

搜索更多相关主题的帖子: 源代码 改进 
2005-04-17 11:15
zhtmark
Rank: 1
等 级:新手上路
帖 子:100
专家分:0
注 册:2005-3-25
收藏
得分:0 
我回去看看。

zhtmark QQ:451361060
2005-04-20 15:07
流浪者
Rank: 1
等 级:新手上路
帖 子:74
专家分:0
注 册:2005-4-24
收藏
得分:0 

看这个: #include <stdio.h> #include <stdlib.h>

int A,B,C,D; int a,b,c,d;

void Pailie(int i) { switch(i) { case 1:A=a,B=b,C=c,D=d;break; case 2:A=a,B=b,C=d,D=c;break; case 3:A=a,B=c,C=b,D=d;break; case 4:A=a,B=c,C=d,D=b;break; case 5:A=a,B=d,C=b,D=c;break; case 6:A=a,B=d,C=c,D=b;break;

case 7:A=b,B=a,C=c,D=d;break; case 8:A=b,B=a,C=d,D=c;break; case 9:A=b,B=c,C=a,D=d;break; case 10:A=b,B=c,C=d,D=a;break; case 11:A=b,B=d,C=c,D=a;break; case 12:A=b,B=d,C=a,D=c;break;

case 13:A=c,B=a,C=d,D=b;break; case 14:A=c,B=a,C=b,D=d;break; case 15:A=c,B=b,C=a,D=d;break; case 16:A=c,B=b,C=d,D=a;break; case 17:A=c,B=d,C=a,D=b;break; case 18:A=c,B=d,C=b,D=a;break;

case 19:A=d,B=a,C=b,D=c;break; case 20:A=d,B=a,C=c,D=b;break; case 21:A=d,B=b,C=a,D=c;break; case 22:A=d,B=b,C=c,D=a;break; case 23:A=d,B=c,C=a,D=b;break; case 24:A=d,B=c,C=b,D=a;break; } }

int Find() { int i,j,sum; float result;

sum=a+b+c+d; for(i=1;i<=37;i++) switch(i) { case 1: if(sum==24) { printf("The answer is %d+%d+%d+%d\n\n",a,b,c,d); return 0; } break; case 2: if(sum>24) { if(24==sum-2*a) { printf("The answer is %d+%d+%d-%d\n\n",b,c,d,a); return 0; } if(24==sum-2*b) { printf("The answer is %d+%d+%d-%d\n\n",a,c,d,b); return 0; } if(24==sum-2*c) { printf("The answer is %d+%d+%d-%d\n\n",a,b,d,c); return 0; } if(24==sum-2*d) { printf("The answer is %d+%d+%d-%d\n\n",a,b,c,d); return 0; } } break; case 3: for(j=1;j<=24;j++) { Pailie(j); result=A+B+C*D; if(result==24) { printf("The answer is %d+%d+%d*%d\n\n",A,B,C,D); return 0; } } break; case 4: for(j=1;j<=24;j++) { Pailie(j); result=A+(B+C)*D; if(result==24) { printf("The answer is %d+(%d+%d)*%d\n\n",A,B,C,D); return 0; } } break; case 5: for(j=1;j<=24;j++) { Pailie(j); result=(A+B+C)*D; if(result==24) { printf("The answer is (%d+%d+%d)*%d\n\n",A,B,C,D); return 0; } } break; case 6: for(j=1;j<=24;j++) { Pailie(j); result=(A+B)*(C+D); if(result==24) { printf("The answer is (%d+%d)*(%d+%d)\n\n",A,B,C,D); return 0; } } break; case 7: for(j=1;j<=24;j++) { Pailie(j); result=A+B*C*D; if(result==24) { printf("The answer is %d+%d*%d*%d\n\n",A,B,C,D); return 0; } } break; case 8: for(j=1;j<=24;j++) { Pailie(j); result=A*B+C*D; if(result==24) { printf("The answer is %d*%d+%d*%d\n\n",A,B,C,D); return 0; } } break; case 9: for(j=1;j<=24;j++) { Pailie(j); result=(A+B)*C*D; if(result==24) { printf("The answer is (%d+%d)*%d*%d\n\n",A,B,C,D); return 0; } } break; case 10: for(j=1;j<=24;j++) { Pailie(j); result=(A+B*C)*D; if(result==24) { printf("The answer is (%d+%d*%d)*%d\n\n",A,B,C,D); return 0; } } break; case 11: result=A*B*C*D; if(result==24) { printf("The answer is %d*%d*%d*%d\n\n",A,B,C,D); return 0; } break; case 12: for(j=1;j<=24;j++) { Pailie(j); result=(A-B)*(C-D); if(result==24) { printf("The answer is (%d-%d)*(%d-%d)\n\n",A,B,C,D); return 0; } } break; case 13: for(j=1;j<=24;j++) { Pailie(j); result=A*(B-C-D); if(result==24) { printf("The answer is %d*(%d-%d-%d)\n\n",A,B,C,D); return 0; } } break; case 14: for(j=1;j<=24;j++) { Pailie(j); result=A*B-C-D; if(result==24) { printf("The answer is %d*%d-%d-%d\n\n",A,B,C,D); return 0; } } break; case 15: for(j=1;j<=24;j++) { Pailie(j); result=A*(B-C)-D; if(result==24) { printf("The answer is %d*(%d-%d)-%d\n\n",A,B,C,D); return 0; } } break; case 16: for(j=1;j<=24;j++) { Pailie(j); result=A*B*C-D; if(result==24) { printf("The answer is %d*%d*%d-%d\n\n",A,B,C,D); return 0; } } break; case 17: for(j=1;j<=24;j++) { Pailie(j); result=A*B-C*D; if(result==24) { printf("The answer is %d*%d-%d*%d\n\n",A,B,C,D); return 0; } } break; case 18: for(j=1;j<=24;j++) { Pailie(j); result=(A-B)*C*D; if(result==24) { printf("The answer is (%d-%d)*%d*%d\n\n",A,B,C,D); return 0; } } break; case 19: for(j=1;j<=24;j++) { Pailie(j); result=(A-B*C)*D; if(result==24) { printf("The answer is (%d-%d*%d)*%d\n\n",A,B,C,D); return 0; } } break; case 20: for(j=1;j<=24;j++) { Pailie(j); result=A+B+1.0*C/D; if(result==24) { printf("The answer is %d+%d+%d/%d\n\n",A,B,C,D); return 0; } } break; case 21: for(j=1;j<=24;j++) { Pailie(j); result=A*D*1.0/(B*D-C); if(result==24) { printf("The answer is %d/(%d-%d/%d)\n\n",A,B,C,D); return 0; } } break; case 22: for(j=1;j<=24;j++) { Pailie(j); result=A*B*C*1.0/D; if(result==24) { printf("The answer is %d*%d*%d/%d\n\n",A,B,C,D); return 0; } } break; case 23: for(j=1;j<=24;j++) { Pailie(j); result=A*B*1.0/C/D; if(result==24) { printf("The answer is %d*%d/%d/%d\n\n",A,B,C,D); return 0; } }break; case 24: for(j=1;j<=24;j++) { Pailie(j); result=(A+B-C)*1.0/D; if(result==24) { printf("The answer is (%d+%d-%d)/%d\n\n",A,B,C,D); return 0; } } break; case 25: for(j=1;j<=24;j++) { Pailie(j); result=(A+B)*C-D; if(result==24) { printf("The answer is (%d+%d)*%d-%d\n\n",A,B,C,D); return 0; } } break; case 26: for(j=1;j<=24;j++) { Pailie(j); result=A*B+C-D; if(result==24) { printf("The answer is %d*%d+%d-%d\n\n",A,B,C,D); return 0; } } break; case 27: for(j=1;j<=24;j++) { Pailie(j); result=(A+B)*(C-D); if(result==24) { printf("The answer is (%d+%d)*(%d-%d)\n\n",A,B,C,D); return 0; } } break; case 28: for(j=1;j<=24;j++) { Pailie(j); result=(A-B)*C+D; if(result==24) { printf("The answer is (%d-%d)*%d+%d\n\n",A,B,C,D); return 0; } } break; case 29: for(j=1;j<=24;j++) { Pailie(j); result=(A+B)*1.0*C/D; if(result==24) { printf("The answer is (%d+%d)*%d/%d\n\n",A,B,C,D); return 0; } } break; case 30: for(j=1;j<=24;j++) { Pailie(j); result=A+B*1.0*C/D; if(result==24) { printf("The answer is %d+%d*%d/%d\n\n",A,B,C,D); return 0; } } break; case 31: for(j=1;j<=24;j++) { Pailie(j); result=A*B*1.0/(C+D); if(result==24) { printf("The answer is %d*%d/(%d+%d)\n\n",A,B,C,D); return 0; } } break; case 32: for(j=1;j<=24;j++) { Pailie(j); result=(A-B)*1.0*C/D; if(result==24) { printf("The answer is (%d-%d)*%d/%d\n\n",A,B,C,D); return 0; } } break; case 33: for(j=1;j<=24;j++) { Pailie(j); result=A*B*1.0/(C-D); if(result==24) { printf("The answer is %d*%d/(%d-%d)\n\n",A,B,C,D); return 0; } } break; case 34: for(j=1;j<=24;j++) { Pailie(j); result=A*(B*D-C)*1.0/D; if(result==24) { printf("The answer is %d*(%d-%d/%d)\n\n",A,B,C,D); return 0; } } break; case 35: for(j=1;j<=24;j++) { Pailie(j); result=A*(B*D+C)*1.0/D; if(result==24) { printf("The answer is %d*(%d+%d/%d)\n\n",A,B,C,D); return 0; } } break; case 36: for(j=1;j<=24;j++) { Pailie(j); result=A*(B/C-D); if(result==24) { printf("The answer is %d*(%d/%d-%d)\n\n",A,B,C,D); return 0; } } break; case 37: for(j=1;j<=24;j++) { Pailie(j); result=A*B-1.0*C/D; if(result==24) { printf("The answer is %d*%d-%d/%d\n\n",A,B,C,D); return 0; } } printf("NO ANSWER!\n\n"); return(0); break; } }

int main() { int i,flag=0; char choice;

puts("================================================================"); puts("\t\t\t欢迎参与24点游戏"); puts("================================================================"); puts("");

START: a=b=c=d=0; while(a<1||b<1||c<1||d<1||a>10||b>10||c>10||d>10) { printf("Please enter four num(1~10):"); scanf("%d%d%d%d",&a,&b,&c,&d); } printf("%5d%5d%5d%5d\n",a,b,c,d); Find();

fflush(stdin); printf("Test again or exit(Press 'Y' or other key):"); choice=getchar(); if(choice=='Y'||choice=='y') { printf("%c\n",choice); goto START; }

return 0; }


我因我之为我而不同凡响~~~
2005-04-26 19:31
乌鸦丘比特
Rank: 1
等 级:新手上路
威 望:2
帖 子:625
专家分:0
注 册:2004-7-19
收藏
得分:0 
让我想起了自己的处女作……

我喜欢创造,一只扑腾着翅膀向天空飞翔的乌鸦
2005-04-27 12:35
乌鸦丘比特
Rank: 1
等 级:新手上路
威 望:2
帖 子:625
专家分:0
注 册:2004-7-19
收藏
得分:0 
楼主的作品支持分数计算吗?

我喜欢创造,一只扑腾着翅膀向天空飞翔的乌鸦
2005-04-27 12:37
乌鸦丘比特
Rank: 1
等 级:新手上路
威 望:2
帖 子:625
专家分:0
注 册:2004-7-19
收藏
得分:0 
对了,楼主多大了?

我喜欢创造,一只扑腾着翅膀向天空飞翔的乌鸦
2005-04-27 12:46
牛虻
Rank: 1
等 级:新手上路
威 望:1
帖 子:472
专家分:0
注 册:2004-10-1
收藏
得分:0 
以下是引用乌鸦丘比特在2005-4-27 12:46:08的发言: 对了,楼主多大了?
比乌鸦你大3岁

土冒
2005-04-27 15:49
yuki
Rank: 2
等 级:新手上路
威 望:5
帖 子:508
专家分:0
注 册:2005-2-4
收藏
得分:0 
以下是引用乌鸦丘比特在2005-4-27 12:37:05的发言: 楼主的作品支持分数计算吗?
计算时支持分数的,但输入的数字必须是整数的。。

我们都在命运湖上荡舟划桨,波浪起伏使我们无法逃离孤行;如果我们迷失方向,波浪将指引我们穿过另一天曙光
2005-04-27 16:48
yuki
Rank: 2
等 级:新手上路
威 望:5
帖 子:508
专家分:0
注 册:2005-2-4
收藏
得分:0 
以下是引用乌鸦丘比特在2005-4-27 12:46:08的发言: 对了,楼主多大了?
今年我刚上大一。。。。

我们都在命运湖上荡舟划桨,波浪起伏使我们无法逃离孤行;如果我们迷失方向,波浪将指引我们穿过另一天曙光
2005-04-27 16:49
乌鸦丘比特
Rank: 1
等 级:新手上路
威 望:2
帖 子:625
专家分:0
注 册:2004-7-19
收藏
得分:0 
不好意思,没时间看你的代码,问一下你的思想吧,是什么思路?栈搜索吗?还是直接穷举所有可能?
哎……怎么都是比我老的人呢……(大家别K我啊)

我喜欢创造,一只扑腾着翅膀向天空飞翔的乌鸦
2005-04-27 17:02
快速回复:[原创]计算24点c++源代码,大家帮我看看怎么改进。。
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.072286 second(s), 7 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved