/* 猜测产品质量评奖(穷举条件控制) 【问题】5家工厂的产品在一次评比中分获1,2,3,4,5,在公布结果前,已知 E 厂产品肯定不是第二、三名,五厂代表猜测评比结果, A厂的代表说:E厂一定能获得第一名。 B厂的代表说:我厂的产品可能获第二名。 C厂的代表说:A厂的产品质量最次。 D厂的代表说:C厂的产品不是最好的。 E厂的代表说:D厂的产品会获得第一名。 公布结果后,证明只有产品获第一名和第二名的两个厂的代表猜对了。 求5个厂产品各获第几名。 【答案】 A B C D E 5 2 1 3 4 【答案】0 1 2 3 4 4 1 0 2 3 * --------------------- * 最终结果六种可能: 厂号:排名 0:2 1:1 2:3 3:0 4:4 _____ 0:2 1:1 2:4 3:0 4:3 _____ 0:3 1:1 2:2 3:0 4:4 _____ 0:4 1:1 2:0 3:2 4:3 _____ 0:4 1:1 2:2 3:0 4:3 _____ 0:4 1:2 2:1 3:0 4:3 _____ */ class Fac {// 厂类 int id;//厂编号 int paiMing;//厂排名 public Fac(int id,int paiMing){ this.id=id; this.paiMing=paiMing; } public void setAll(int id,int paiMing){ this.id=id; this.paiMing=paiMing; } public void setPaiMing(int paiMing){ this.paiMing=paiMing; } public int getPaiMing(){ return this.paiMing; } public boolean equals(Fac f){ if((this.id==f.id)&&(this.paiMing==f.paiMing)){ return true; }else{ return false; } } } class FacRepresenter {//长代表类 int pid;//厂代表所代表的厂号 Fac f;//厂代表推论的厂排名 public FacRepresenter(int pid, Fac f) { this.f = f; this.pid = pid; } } public class Test { public static boolean isEJudge(Fac f[]){ //判断E即f[4]不为1和2,满足此条件返回true if((f[4].paiMing!=1)&&(f[4].paiMing!=2)){ return true; }else{ return false; } } public static boolean isNoChongFu(Fac []fa){ //判断产生的fa有重复否 无重复true boolean ft=true; for(int i=0;i<fa.length;i++){ for(int j=i+1;j<fa.length;j++){ if(fa[i].paiMing==fa[j].paiMing){ ft=false; } } } return ft; } public static boolean isSuitFacRepre(Fac f[],FacRepresenter fp[]){ //判断是否满足长代表的猜测, 满足true int counter=0; for(int i=0;i<f.length;i++){ for(int j=0;j<fp.length;j++){ if(fp[j].f.equals(f[i])){ counter++; } } }// if(counter>0){ return true; }else{ return false; } } public static boolean isFirstSecondGuessRight(Fac f[],FacRepresenter fp[]){ //第一二名猜对否 猜对返回true int fir=0,sec=0; int firI=0,secI=0; boolean firGuess=false,secGuess=false; for(int i=0;i<f.length;i++){ if(f[i].paiMing==0){ fir=f[i].id; firI=i; } if(f[i].paiMing==1){ sec=f[i].id; secI=i; } }/// for(int i=0;i<fp.length;i++){ if(fp[i].pid==fir){ for(int j=0;j<f.length;j++){ if(fp[i].f.equals(f[j])){ firGuess=true; } } }// if(fp[i].pid==sec){ for(int j=0;j<f.length;j++){ if(fp[i].f.equals(f[j])){ secGuess=true; } } } }/// if(firGuess&&secGuess){ return true; }else{ return false; } } public static void show(Fac fa[]){ //显示Fac表 for(int i=0;i<fa.length;i++){ System.out.println(fa[i].id+":"+fa[i].paiMing); } } public static void showFP(FacRepresenter fp[]){ //显示FacRepresenter表 for(int i=0;i<fp.length;i++){ System.out.println(fp[i].pid+":F:"+fp[i].f.id+":"+fp[i].f.paiMing); } } public static void main(String args[]) { Fac [] fa=new Fac[5]; FacRepresenter fp[]=new FacRepresenter[8]; fp[0]=new FacRepresenter(0,new Fac(4,0)); fp[1]=new FacRepresenter(1,new Fac(1,1)); fp[2]=new FacRepresenter(2,new Fac(0,4)); fp[3]=new FacRepresenter(3,new Fac(2,1)); fp[4]=new FacRepresenter(3,new Fac(2,2)); fp[5]=new FacRepresenter(3,new Fac(2,3)); fp[6]=new FacRepresenter(3,new Fac(2,4)); fp[7]=new FacRepresenter(4,new Fac(3,0)); //showFP(fp); for(int i=0;i<fa.length;i++){ fa[i]=new Fac(i,i); }// ///////////////////////////////////////////////// for(int i=0;i<fa.length;i++){ for(int j=0;j<fa.length;j++){ for(int k=0;k<fa.length;k++){ for(int m=0;m<fa.length;m++){ for(int n=0;n<fa.length;n++){ // fa[0].setPaiMing(i); fa[1].setPaiMing(j); fa[2].setPaiMing(k); fa[3].setPaiMing(m); fa[4].setPaiMing(n); if(isNoChongFu(fa)&&isEJudge(fa)&&isSuitFacRepre(fa,fp)&&isFirstSecondGuessRight(fa,fp)){ show(fa); System.out.println("_____"); } // } } } } }// } }