uva 10344 - 23 out of 5

Problem I

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
算23点。开始递归的时候每次都穷举一个数一个符号,然后当前这个数与之前的数的符号结合再运算,把自己搞晕了.....
直接穷举第一位,然后下次穷举出的数和符号就可以直接运算再回溯,5!*3^4规模
#include<stdio.h>
#include<string.h>
int f,visit[10],a[10],b[10];
int sort(int n,int num)
{int i;
 if ((n==5)&&(num==23)) f=1;
 if ((n>=5)||(f)) return 0;
 for (i=1;i<=5;i++)
 if (visit[i]==0)
 {visit[i]=1;
  sort(n+1,num+a[i]);
  sort(n+1,num-a[i]);
  sort(n+1,num*a[i]);
  visit[i]=0;
 }
}
int main()
{int i;
 while (scanf("%d",&a[1]))
 {
  for (i=2;i<=5;i++)
  scanf("%d",&a[i]);
  if ((a[1]==0)&&(a[2]==0)&&(a[3]==0)&&(a[4]==0)&&(a[5]==0)) break;
  memset(visit,0,sizeof(visit));
  memset(b,0,sizeof(b));
  f=0;
  for (i=1;i<=5;i++)
  {visit[i]=1;
   sort(1,a[i]);
   visit[i]=0;
  }
  if (f) printf("Possible\n");
    else printf("Impossible\n");
 }
 return 0;
}

 
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值