先用next_permutation生成所有的排列,然后针对每一个排列做递归枚举,找到一组运算符合要求就进行回溯。
#include <stdio.h>
#include <algorithm>
using namespace std;
int arr[5];
bool stop;
#define ADD 0
#define SUB 1
#define MUL 2
int cmp(const void *a, const void *b)
{
return *((int*)a) - *((int*)b);
}
void dfs(int cur, int last_result, int operation)
{
int result;
if(stop)
return;
if(cur == 5)
{
if(last_result == 23)
stop = true;
return;
}
switch(operation)
{
case ADD:
result = last_result + arr[cur];
break;
case SUB:
result = last_result - arr[cur];
break;
case MUL:
result = last_result * arr[cur];
break;
}
dfs(cur+1, result, ADD);
dfs(cur+1, result, SUB);
dfs(cur+1, result, MUL);
}
void func()
{
qsort((void*)arr, 5, sizeof(int), cmp);
stop = false;
do
{
dfs(0, 0, ADD);
if(stop)
break;
} while (next_permutation(arr, arr+5));
if(stop)
printf("Possible\n");
else
printf("Impossible\n");
}
int main(void)
{
int i, count;
//freopen("input.dat", "r", stdin);
while(1)
{
count = 0;
for(i=0; i<=4; i++)
{
scanf("%d", arr+i);
if(arr[i] == 0)
count ++;
}
if(count == 5)
break;
func();
}
return 0;
}