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:
Input is terminated by a line containing five zero's. This line should not be processed.
题意:
给出的数字,利用加减乘的规则看能不能变成23;
同样的利用回溯来做;
#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]
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 of 5
- UVA 10344 - 23 Out of 5(回溯)
- UVA - 10344 23 out of 5
- UVA 10344- 23 out of 5
- UVA 10344 - 23 out of 5
- UVA 10344 - 23 out of 5 全排列,3进制表示状态,回溯
- UVa 10344 - 23 out of 5
- uva-10344 - 23 out of 5
- UVA - 10344 - 23 out of 5 (暴力)
- uva-10344 - 23 out of 5
- UVA 10344 - 23 out of 5
- UVA 10344 23 out of 5(搜索+全排列)
- uva 10344 23 out of 5(DFS)
- uva-10344 - 23 out of 5
- UVA 10344 23 out of 5
- UVaOJ10344 - 23 out of 5
- UVa 10344 - 23 out of 5
- uva10344 - 23 out of 5
- UVa 10344 - 23 out of 5 递归回溯
- UVa 10344 - 23 out of 5 全排列递归回溯