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;}
- POJ 1348
- POJ 1348 Computing 笔记
- POJ
- poj
- POJ
- POJ
- poj
- poj
- POJ
- POJ
- poj
- POJ
- POJ
- POJ
- POJ
- POJ
- POJ
- POJ
- UML::UML中的视图
- 跟我学习GNU Emacs - 01
- tomcat部署之后 本机访问本地部署的网站打开一个页面非常慢
- Java 单向链表
- popen 使用总结
- POJ 1348
- 如何在多个移动平台上创建新的cocos2d-x项目
- PHP访问数组中元素的方法
- 扩展欧几里德算法
- Android的UI组件之TabHost(选项卡)的功能和用法
- POJ 2258
- 郭松龄 李景林 吕正操
- java synchronized详解
- 综合学习网站