1、回溯法,枚举运算符和操作数,不要忘记修改vis数组。
2、确确实实感觉到自己解题能力有所提高O(∩_∩)O~这么一道通过率不算高的题,竟然很快写出并一次AC。。。
#include<cstdio>
#include<cstring>
using namespace std;
int a[6],vis[6];
bool dfs(int num,int depth){
if(num==23&&depth==5){
return true;
}
if(depth==0){
for(int i=1;i<=5;i++){
vis[i]=1;
if(dfs(a[i],depth+1)) return true;
vis[i]=0;
}
}
else{
for(int i=1;i<=5;i++)
if(!vis[i]){
vis[i]=1;
if(dfs(num+a[i],depth+1)) return true;
if(dfs(num-a[i],depth+1)) return true;
if(dfs(num*a[i],depth+1)) return true;
vis[i]=0;
}
}
return false;
}
int main(){
//freopen("a.txt","r",stdin);
while(1){
for(int i=1;i<=5;i++)
scanf("%d",&a[i]);
if(a[1]==0)break;
memset(vis,0,sizeof(vis));
if(dfs(0,0))
printf("Possible\n");
else
printf("Impossible\n");
}
return 0;
}