POJ 1348

来源:互联网 发布:java分布式开发 编辑:程序博客网 时间:2024/04/30 03:35

学校测试时看到这道题,没做出来,就从老师那弄的参考程序,就贴上来了.......

#include <stdio.h>int a[5];  //定义数组int v[5];   //定义标志数组int dfs(int k,int m){//一开始k=1,k表示参与运算数的个数//m表示前k个数的运算结果//该子程序可以实现四个数依次参与运//算的所有运算方式    int i;    if(k==4)  //前四个数运算完毕    {        if(m==a[4])            return 1;        else            return 0;    }    for(i=0;i<4;i++)        if(v[i]==0) //a[i]还没参与过运算        {            v[i] = 1;//进行六种可能的运算            if(dfs(k+1,m*a[i])) return 1;            if(dfs(k+1,m+a[i])) return 1;            if(dfs(k+1,m-a[i])) return 1;            if(dfs(k+1,a[i]-m)) return 1;            if(a[i]!=0)            {                if(dfs(k+1,m/a[i])) return 1;            }            if(m!=0)            {                if(dfs(k+1,a[i]/m)) return 1;            }            v[i] = 0;   //若没成功标志位重新置零        }//ifreturn 0;//若所有运算失败则返回0}//dfs//经上面dfs函数运算后只有十六种运算符排列方式int add_or_sub(int k){/*两边有括号,括号内部是乘号或除号,中间的运算符为加号或减号的运算方式如(x*y)+(z/w)*///第k个数的标志位已置1    int m,n,x,y;    int i,l,j;    for(i=0;i<4;i++)        if(v[i]==0)//任取一个没用过的数字        {            v[i] = 1;            m = a[k]*a[i];            x = 1000000;//给x一个较大值            if(a[i])//若a[i]!=0进行除法运算                x = a[k] / a[i];            for(j=0;j<4;j++)            {                if(v[j]==0)                {//任取一个没用过的数字赋值给n,y                    n = a[j];                    y = a[j];                    v[j]=1;                    for(l=0;l<4;l++)                        if(v[l]==0)                        {                            if(a[l])//a[l]!=0                            {                                n /= a[l];                                y *= a[l];if((m+n==a[4])||(m-n==a[4])||(n-m==a[4])||(m+y==a[4])||(m-y==a[4])||(y-m==a[4]))return 1;if(x<1000)   //若x经过运算了,看x参与的运算能否成立if((x+n==a[4])||(x-n==a[4])||(n-x==a[4])||(x+y==a[4])||(x-y==a[4])||(y-x==a[4]))return 1;                            }    //if                            else//a[l]=0则不能运算 n/=a[l],y *= a[l]则y=0,需要m=a[4]或x=a[4]                                if((m==a[4])||(x==a[4]))                                    return 1;                        }  //if                        v[j]=0; //取a[j]为第三个元素失败,v[j]置零                }   //if            }   //for            v[i]=0; //取a[i]为第二个元素失败,v[i]置零        }     //if return 0; //若所有运算失败则返回0 }   //add_or_subint mul_or_div(int k){/*两边有括号,括号内部是加号或减号,中间的运算符为乘号或除号的运算方式如(x+y)*(z-w)*///第k个数的标志位已置1    int m,n,x,y;    int i,j,l;    for(i=0;i<4;i++)        if(v[i]==0)        {            v[i]=1;            m = a[k]+a[i];            x = a[k]-a[i];//取两个数进行加减运算for(j=0;j<4;j++)            {                if(v[j]==0)                {                    n = a[j];                    y = a[j];                    v[j]=1;                    for(l=0;l<4;l++)                        if(v[l]==0)                        {                            n += a[l];                            y -= a[l];//取剩余两个数进行加减运算                            if((m*n==a[4])||(m*y==a[4])||(x*n==a[4])||(x*y==a[4]))return 1;                            if(n!=0)if((m/n==a[4])||(x/n==a[4]))  return 1;if(m!=0)if((n/m==a[4])||(y/m==a[4]))  return 1;if(y!=0)if((m/y==a[4])||(x/y==a[4]))  return 1;if(x!=0)if((n/x==a[4])||(y/x==a[4]))  return 1;                        }v[j]=0;                }            }            v[i]=0;        }return 0;}    //mul_or_divint done()        //done函数{    int i;for( i=0;i<4;i++){        v[0]=v[1]=v[2]=v[3]=0;    //标志位全部置零v[i] = 1;     //标记当前选出的数字if(dfs(1,a[i]))   return 1; /*调用dfs函数,使当前选中的元素为dfs函数计算的第一个数字,若成功则返回1*/ }    for( i=0;i<4;i++){        v[0]=v[1]=v[2]=v[3]=0;v[i] = 1;        if(add_or_sub(i)) return 1;        if(mul_or_div(i))  return 1;    }return 0;//若前四个数经各种运算均不能得到n5则返回0}int main(){    int i;    while(1)    {        scanf("%d",&a[0]);    //输入第一个数        if(a[0]<0)            break;     //若输入是-1则结束程序        v[0] = 0;        for(i=1;i<5;i++)      //输入后四个数并且标志位置零        {scanf("%d",&a[i]);            v[i] = 0;        }        for(i=0;i<5;i++)  printf("%d ",a[i]);    //先将五个数字输出出来        if(done()) printf("OK!\n");  //调用子函数done        else  printf("NO!\n");    }//while    return 0;}


 

原创粉丝点击