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。判断是否有解
// 算法:回溯
time 1.692
#include<cstdio> #include<cstring> #include<iostream> #include<string> #include<algorithm> using namespace std; int a[5]; int b[5]; char op[5]; int vis[5]; int possible; void dfs(int d, int s) { if(d==5) { if(s==23) { possible=1; #ifndef ONLINE_JUDGE printf("(((%d ", b[0]); for(int i=1;i<4;i++) printf("%c %d) ", op[i], b[i]); printf("%c %d ", op[4], b[4]); printf("\n"); #endif } return; } for(int i=0;i<5;i++) { //第一个数 if(d==0) { if(!vis[i]) { vis[i]=1; b[d]=a[i]; dfs(d+1, a[i]); vis[i]=0; } } else { if(!vis[i]) { vis[i]=1; b[d]=a[i]; op[d]=‘+‘; dfs(d+1, s+a[i]); op[d]=‘-‘; dfs(d+1, s-a[i]); op[d]=‘*‘; dfs(d+1, s*a[i]); vis[i]=0; } } } } int main() { #ifndef ONLINE_JUDGE freopen("./uva10344.in", "r", stdin); #endif while(scanf("%d%d%d%d%d", a, a+1, a+2, a+3, a+4)==5 && (a[0] || a[1] || a[2] || a[3] || a[4])) { possible=0; dfs(0, 0); if(possible) puts("Possible"); else puts("Impossible"); } return 0; }
找到后立刻返回,time 0.945
学习点,dfs时判断扩展点的返回值,如果已经成功,就直接返回。
#include<cstdio> #include<cstring> #include<iostream> #include<string> #include<algorithm> using namespace std; int a[5]; int vis[5]; bool dfs(int d, int s) { if(d==5) return s==23; for(int i=0;i<5;i++) if(!vis[i]) { vis[i]=1; //第一个数 if(d==0) { if(dfs(d+1, a[i])) return true; } else { if(dfs(d+1, s+a[i])) return true; if(dfs(d+1, s-a[i])) return true; if(dfs(d+1, s*a[i])) return true; } vis[i]=0; } return false; } int main() { #ifndef ONLINE_JUDGE freopen("./uva10344.in", "r", stdin); #endif while(scanf("%d%d%d%d%d", a, a+1, a+2, a+3, a+4)==5 && (a[0] || a[1] || a[2] || a[3] || a[4])) { memset(vis, 0, sizeof(vis)); if(dfs(0, 0)) puts("Possible"); else puts("Impossible"); } return 0; }
next_permutation 计算差点超时: 2.388
#include<cstdio> #include<cstring> #include<iostream> #include<string> #include<algorithm> using namespace std; int a[5]; bool check(int k) { int s=a[0]; for(int j=1;j<5;j++) { switch(k%3) { case 0: s+=a[j]; break; case 1: s-=a[j]; break; case 2: s*=a[j]; break; } k/=3; } return s==23; } int main() { #ifndef ONLINE_JUDGE freopen("./uva10344.in", "r", stdin); #endif while(scanf("%d%d%d%d%d", a, a+1, a+2, a+3, a+4)==5 && (a[0] || a[1] || a[2] || a[3] || a[4])) { sort(a, a+5); int ok=0; do { for(int i=0;i<81;i++) if(check(i)) { ok=1; break; } }while(!ok && next_permutation(a, a+5)); if(ok) puts("Possible"); else puts("Impossible"); } return 0; }
uva10344 - 23 out of 5
时间: 2024-11-10 20:38:55