您的位置:首页 > 其它

UVA - 10344 23 out of 5

2014-10-23 00:00 549 查看
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;

同样的利用回溯来做;

#include<stdio.h>
#include<string.h>
int a[10],vis[10];
int dfs(int cur,int tot)
{
int i,j,t;
if(cur==5)
{
if(tot==23)
return 1;
else
return 0;
}
for(i=0;i<3;i++)
for(j=0;j<5;j++)
if(!vis[j])
{
vis[j]=1;
if(i==0)
t=tot+a[j];
else if(i==1)
t=tot-a[j];
else
t=tot*a[j];
if(dfs(cur+1,t))
return 1;
vis[j]=0;
}
return 0;
}
int main()
{
int i,j,k,ok;
while(1)
{
for(i=0;i<5;i++)
scanf("%d",&a[i]);
if(a[0]==0)
break;
memset(vis,0,sizeof(vis));
ok=0;
for(i=0;i<5;i++)
{
vis[i]=1;
if(dfs(1,a[i]))
{
ok=1;
break;
}
vis[i]=0;
}
if(ok)
printf("Possible\n");
else
printf("Impossible\n");
}
return 0;
}


#include <iostream>
#include <cstdio>
#include <cstring>
#define N 5
using namespace std;
int a
;
int vis
;
int flag;
void dfs(int n,int sum) {

if (n == 5 && sum == 23) {
flag = 1;
return ;
}
if (flag) return ; // 没有这一步会超时
else {
for (int j = 0; j < N; j++) {
if (!vis[j]) {
vis[j] = 1;
if (n == 0) dfs(n+1,a[j]);
else {
dfs(n+1,sum + a[j]);
dfs(n+1,sum - a[j]);
dfs(n+1,sum * a[j]);
}
vis[j] = 0;
}
}
}

}

int main() {
while (1){
for (int i = 0; i < N; i++)
scanf("%d",&a[i]);
if (a[0] == 0 && a[1] == 0 && a[2] == 0 && a[3] == 0 && a[4] == 0)
break;
memset(vis,0,sizeof(vis));
flag = 0;
dfs(0,0);
if (flag) printf("Possible\n");
else printf("Impossible\n");
}

}

[align=center][/align]
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  UVA - 10344 23 out o