24点问题算法

来源:互联网 发布:虚拟软件 编辑:程序博客网 时间:2024/05/21 08:33

DFS

代码来自 http://blog.csdn.net/hjkhjk007/article/details/9016489

#include <iostream>#include <string>#include <cmath>#include <sstream>using namespace std;const double PRECISION = 1E-6;const int COUNT = 4;const int RESULT = 24;double number[COUNT];     //这里一定要用double,看看第一题的答案就知道为什么了string expression[COUNT];    //保存表达式bool Test(int n){//递归结束    if (n == 1)    {      if (fabs(number[0] - RESULT) < 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 (Test(n - 1))            return true;        //减号有两种情况,a-b与b-a        expression[i] = '(' + expa + '-' + expb + ')';        number[i] = a - b;        if (Test(n - 1))            return true;        expression[i] = '(' + expb + '-' + expa + ')';        number[i] = b - a;        if (Test(n - 1))            return true;        expression[i] = '(' + expa + '*' + expb + ')';        number[i] = a * b;        if (Test(n - 1))            return true;        //除法也有两种情况,a/b与b/a        if (b != 0)        {            expression[i] = '(' + expa + '/' + expb + ')';            number[i] = a / b;            if (Test(n - 1))            return true;        }        if (a != 0)        {            expression[i] = '(' + expb + '/' + expa + ')';            number[i] = b / a;            if (Test(n - 1))            return true;        }        //恢复数组        number[i] = a;        number[j] = b;        expression[i] = expa;        expression[j] = expb;    }}return false;}int main(void){    for (int i = 0; i < COUNT; i++)    {           char buffer[20];        int x;        cin >> x;        number[i] = x;            stringstream ss;        ss << x;        expression[i] = ss.str();    }     if (Test(COUNT))      cout << "Success" << endl;     else      cout << "Fail" << endl;     return 0;}

问题2.  (http://www.careercup.com/question?id=16230693)

given an int array with no duplicate numbers, write a function to return number of ways to calculate a target number. 

example: given {2,4,6,8} Target = 12 
2 + 4 + 6 = 12, 
4 + 8 = 12, 
6 + 8 - 2 = 12, 
2 - 4 + 6 + 8 = 12, 

return 4

code using recursion

int getNoOfWays(int array[], int length, int index, int target){        if(index >= length && target != 0)                return 0;        if(target == 0)                return 1;        int x = getNoOfWays(array, length, index+1, target);        int y = getNoOfWays(array, length, index+1, target-array[index]);        int z = getNoOfWays(array, length, index+1, target+array[index]);        return x+y+z;}int main(void){<span style="white-space:pre"></span>int array[] = {2,4,6,8};<span style="white-space:pre"></span>cout << getNoOfWays(array, 4, 0, 12) << endl;<span style="white-space:pre"></span>return 0;}


0 0
原创粉丝点击