-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathcnopriority.cpp
More file actions
98 lines (98 loc) · 1.71 KB
/
Copy pathcnopriority.cpp
File metadata and controls
98 lines (98 loc) · 1.71 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
#include<iostream>
using namespace std;
int k;
class readin
{
friend int nreadin(int n,int m);
private:
bool found(); //found判断是否找到解
bool search(int t);
int n,m,x;
int * a; //给定的用于运算n个正整数的存放位置
int* num; //存放运算的产生整数m
int* operate;
int* flag;
char* ptr; //存储结果中的运符
};
//用迭代加深的回溯法
bool readin::search(int depth) //depth:递归深度
{
if(depth>k)
{
if(found())
return true; //判断结点是否满足件,即是否找到解
else
return false;
}
else
for(int i=0;i<n;i++)
if(flag[i]==0)
{
num[depth]=a[i];
flag[i]=1;
for(int j=0;j<4;j++)
{
operate[depth]=j;
if(search(depth+1))
return true;
}
flag[i]=0;
}
return false;
}
bool readin::found()
{
int x=num[0];
for(int i=0;i<k;i++)
{
switch (operate[i])
{
case 0:x+=num[i+1];ptr[i]='+';break;
case 1:x-=num[i+1];ptr[i]='-';break;
case 2:x*=num[i+1];ptr[i]='*';break;
case 3:x/=num[i+1];ptr[i]='/';break;+
}
}
return(x==m);
}
//读入初始数据
int nreadin(int n,int m)
{
readin X;
int i;
int* a=new int[n];
int* num=new int[n];
int* operate=new int[n];
int* flag=new int[n];
char* ptr=new char[n];
X.n=n;
X.m=m;
X.a=a;
X.operate=operate;
X.flag=flag;
X.num=num;
X.ptr=ptr;
for(int i=0;i<n;i++)
{
cin>>a[i];
flag[i]=0;
}
for(k=0;k<n;k++)
if(X.search(0)){
cout<<k<<endl;
return 0;
}
cout<<"No Solution!"<<endl;
return 0;
}
int main(void)
{
int n;
int m;
while(1){
cin>>n>>m;
if (n==0&&m==0) break;
nreadin(n,m);
}
return 0;
}