uva 10344 23 out of 5(DFS)

23 Out of 5

Input: standard input

Output: standard output

Time Limit: 1 second

Memory Limit: 32 MB

Your task is to write a program that can decide whether you can find an arithmetic expression consisting of five given numbers (1<=i<=5) that will yield the value 23.
For this problem we will only consider arithmetic expressions of the following from:

 
where : {1,2,3,4,5} -> {1,2,3,4,5} is a bijective function
and  {+,-,*} (1<=i<=4)

Input

The Input consists of 5-Tupels of positive Integers, each between 1 and 50.
Input is terminated by a line containing five zero's. This line should not be processed.

Output

For each 5-Tupel print "Possible" (without quotes) if their exists an arithmetic expression (as described above) that yields 23. Otherwise print "Impossible".

Sample Input

1 1 1 1 1
1 2 3 4 5
2 3 5 7 11
0 0 0 0 0

Sample Output

Impossible
Possible
Possible
题目大意:给出5个数,任意+,-,*三中运算,没有优先级,如果表达式可能等于23,输出possible,否则输出impossible.

解题思路:DFS。

#include<stdio.h>
#include<string.h>
#include<algorithm>
using namespace std;

#define N 5
#define order 23
#define MAX 10

int num[MAX];
int ok;
int bo;

void dfs(int x, int sum)
{
	if ( sum == order && x == 5)
	{
		ok = 1;
		return ;
	}
	else if (x >= 5)
		return;
	dfs(x + 1, sum + num[x]);
	dfs(x + 1, sum - num[x]);
	dfs(x + 1, sum * num[x]);
}

int main()
{
	while (1)
	{
		// Init.
		memset(num, 0, sizeof(num));
		bo = 1;
		ok = 0;

		// Read.
		for (int i = 0; i < N; i++)
		{
			scanf("%d", &num[i]);
			if (num[i])
				bo = 0;
		}

		if (bo) 
			break;

		sort(num, num + N);

		do{
			dfs(1, num[0]);
		}while(next_permutation(num, num + N));

		if (ok)
			printf("Possible\n");
		else
			printf("Impossible\n");
	}
	return 0;
}


你可能感兴趣的:(uva 10344 23 out of 5(DFS))