uva--10334+dfs+回溯

来源:互联网 发布:中国式逗小孩 知乎 编辑:程序博客网 时间:2024/06/09 17:51

通过穷举第一个元素使得dfs时状态转移变得简单


#include<iostream>#include<cstring>#include<cstdio>#include<queue>using namespace std;int a[100],ans,vis[100],flag;void dfs(int cur,int sum){    int i;    if(cur==5)    {        if(sum==23)           flag=1;        return ;    }    for(i=1;i<=5;i++)    {        if(!vis[i])        {            vis[i]=1;            dfs(cur+1,sum*a[i]);            if(flag) //这是剪枝                return ;            dfs(cur+1,sum-a[i]);            if(flag)                return ;            dfs(cur+1,sum+a[i]);            if(flag)                return ;            vis[i]=0;        }        if(flag)            return ;    }}int main(){    int i;    while(1)    {          for(i=1;i<=5;i++)            scanf("%d",&a[i]);          if(a[1]==0)             break;          memset(vis,0,sizeof(vis));          flag=0;          for(i=1;i<=5;i++)          {              memset(vis,0,sizeof(vis));              if(flag)                break ;              vis[i]=1;              dfs(1,a[i]);          }          if(flag)              printf("Possible\n");          else              printf("Impossible\n");    } return 0;}



0 0
原创粉丝点击