Java实现解出世界最难九宫格问题
芬兰数学家因卡拉花费3个月设计出了世界上迄今难度最大的数独游戏,而且它只有一个答案。因卡拉说只有思考能力最快、头脑最聪明的人才能破解这个游戏。
今日,一则腾讯的新闻称中国老头三天破解世界最难九宫格,虽然最后老人是改了一个数字,但是引起本人一时兴趣,想通过计算机程序求解该问题,于是在宿舍呆了一下午,终于成功求解,程序源码如下。
packagenumberGame;
publicclassPoint{ privateintcol;//行号 privateintrow;//列号 privatebooleanflag;//真为未设置。 privateintvalue; //构造点 publicPoint(intcol,introw,booleanflag,intvalue){ super(); this.col=col; this.row=row; this.flag=flag; this.value=value; }
publicvoidchangeFlag(){ flag=!flag; }
publicbooleangetFlag(){ returnflag; }
publicintgetValue(){ returnvalue; }
publicvoidsetValue(intvalue){ this.value=value; }
publicbooleancanHere(Point[][]pArr){ booleancb=canCol(pArr); booleancr=canRow(pArr); booleancminiArr=canMiniArr(pArr); returncb&&cr&&cminiArr; } //判断在小3*3格子里是否有相同元素 privatebooleancanMiniArr(Point[][]pArr){ intcoltemp=this.col%3; introwtemp=this.row%3;
for(inti=this.col-coltemp;i<col+(3-coltemp);i++){ for(intj=this.row-rowtemp;j<row+(3-rowtemp);j++){ if(i==this.col&&j==this.row){ continue; }else{ if(this.value==pArr[i][j].getValue()){ returnfalse; } } } } returntrue; }
//判断列上是否有相同元素 privatebooleancanRow(Point[][]pArr){ for(inti=0;i<9;i++){ if(i==this.col){ continue; }else{ if(this.value==pArr[i][this.row].value){//行变,列不变 returnfalse; } } } returntrue; }
//判断行上是否有相同元素 privatebooleancanCol(Point[][]pArr){ for(inti=0;i<9;i++){ if(i==this.row){ continue; }else{ if(this.value==pArr[this.col][i].value){//列边,行不变 returnfalse; } } } returntrue; } }