/*
题意:用五个数字和三个运算符组成一个表达式,最后答案是否为23
超时!
不过dfs1和dfs2的搜索顺序变一下可使效率提高一些。小技巧。
不太清楚为什么时间效率会存在不同。。。。
*/
#include <cstdio>
#include <cstring>
int aa[5],a[5],visit[5];
int o[4];
bool ok;
int opre(int a,int op,int b)
{
int c=0;
switch(op)
{
case 0:
c=a+b;
break;
case 1:
c=a-b;
break;
case 2:
c=a*b;
break;
default:
break;
}
return c;
}
void bfs2(int k)
{
if(!ok)
{
if(k==5)
{
int temp;
temp=opre(aa[0],o[0],aa[1]);
temp=opre(temp,o[1],aa[2]);
temp=opre(temp,o[2],aa[3]);
temp=opre(temp,o[3],aa[4]);
if(!ok)
ok=temp==23?true:false;
return;
}
for(int i=0;i<5;i++)
if(!visit[i])
{
visit[i]=1;
aa[k]=a[i];
bfs2(k+1);
visit[i]=0;
}
}
}
void bfs1(int k)
{
if(!ok)
{
if(k==4)
{
bfs2(0);
return;
}
for(int i=0;i<3;i++)
{
o[k]=i;
bfs1(k+1);
}
}
}
int main()
{
//freopen("data.in","r",stdin);
while(1)
{
ok=false;
memset(visit,0,sizeof(visit));
for(int i=0;i<5;i++)
scanf("%d",&a[i]);
if(!a[0] && !a[1] && !a[2] && !a[3] && !a[4])
break;
bfs1(0);
if(ok)
printf("Possible\n");
else
printf("Impossible\n");
}
return 0;
}
/*
修改后程序
用时:0.432
*/
#include <cstdio>
#include <cstring>
int aa[5],a[5],visit[5];
bool ok;
//int o[4];
void dfs2(int k,int ans)
{
if(ok)
return;
if(k==4)
{
if(ans==23)
ok=true;
return;
}
dfs2(k+1,ans+aa[k+1]);
dfs2(k+1,ans-aa[k+1]);
dfs2(k+1,ans*aa[k+1]);
}
void dfs1(int k)
{
if(ok)
return;
if(k==5)
{
dfs2(0,aa[0]);
return;
}
for(int i=0;i<5;i++)
if(!visit[i])
{
visit[i]=1;
aa[k]=a[i];
dfs1(k+1);
visit[i]=0;
}
}
int main()
{
//freopen("data.in","r",stdin);
while(1)
{
for(int i=0;i<5;i++)
scanf("%d",&a[i]);
if(!a[0] && !a[1] && !a[2] && !a[3] && !a[4])
break;
memset(visit,0,sizeof(visit));
ok=false;
dfs1(0);
if(ok)
printf("Possible\n");
else
printf("Impossible\n");
}
return 0;
}
/*
用时:2.612
将运算符和后面整数看成一个状态进行搜索
*/
#include <cstdio>
#include <cstring>
int a[5],visit[5];
//int o[4];
bool ok;
void dfs(int k,int ans)
{
if(ok)
return;
if(k==4)
{
if(ans==23)
ok=true;
return;
}
for(int i=0;i<3;i++)
for(int j=0;j<5;j++)
if(!visit[j])
{
visit[j]=1;
if(i==0)
dfs(k+1,ans+a[j]);
else if(i==1)
dfs(k+1,ans-a[j]);
else
dfs(k+1,ans*a[j]);
visit[j]=0;
}
}
int main()
{
//freopen("data.in","r",stdin);
while(1)
{
for(int i=0;i<5;i++)
scanf("%d",&a[i]);
if(!a[0] && !a[1] && !a[2] && !a[3] && !a[4])
break;
memset(visit,0,sizeof(visit));
ok=false;
for(int i=0;i<5;i++)
{
visit[i]=1;
dfs(0,a[i]);
visit[i]=0;
}
if(ok)
printf("Possible\n");
else
printf("Impossible\n");
}
return 0;
}