求助——求解和为15的游戏棋盘问题

问题描述

publicclassGrid15{int[][]board;Grid15(){board=newint[3][3];}//输出棋盘的格线行privatevoidoutputGridRowBoard(){inti;System.out.print("+");for(i=0;i<5;i++){System.out.print("-");}System.out.println("+");}//输出棋盘的数据行(第i行,i只能为0、1或2)privatevoidoutputGridRowBoard(inti){intj;for(j=0;j<board[i].length;j++)System.out.print("|"+board[i][j]);System.out.println("|");}//输出棋盘publicvoidoutputGrid(){inti;outputGridRowBoard();for(i=0;i<board.length;i++){outputGridRowBoard(i);outputGridRowBoard();}}//初始化数据privatevoiddataInit(){inti,j,k;for(i=0,k=1;i<board.length;i++)for(j=0;j<board[i].length;j++,k++)board[i][j]=k;}//数据结束检测//返回值说明:当数据为最后一个数据时,返回true,否则;返回false//不明白为什么这个是结束的条件//根据判断条件来看,不是只是判断了中间数字是否为5,若为5则返回TRUE,否则返回false?privatebooleandataEnd(){inti,j,k;for(i=0,k=9;i<board.length;i++)for(j=0;j<board[i].length;j++,k--)if(board[i][j]!=k)returnfalse;returntrue;}//取下一个数据//按照我的理解,这个函数好像是把方格上每个数字加1(9变为1),但这样怎么可能穷尽所有情况呢privatevoiddataNext(){inti,j;for(i=board.length-1;i>=0;i--)for(j=board[i].length-1;j>=0;j--)if(board[i][j]==9)board[i][j]=1;else{board[i][j]++;return;}}//数据检测:判断数据中是否含有相同的数字//当数据中存在相同数字时,返回false;否则,返回trueprivatebooleandataCheckDifferent(){inti,j;int[]digit=newint[10];for(i=0;i<board.length;i++)for(j=0;j<board[i].length;j++)digit[board[i][j]]=1;for(i=1,j=0;i<digit.length;i++)j+=digit[i];if(j==9)returntrue;returnfalse;}//数据检测:各行和是否为15//当各行和均为15时,返回true;否则,返回falseprivatebooleandataCheckSumRow(){inti,j,k;for(i=0;i<board.length;i++){for(j=0,k=0;j<board[i].length;j++)k+=board[i][j];if(k!=15)returnfalse;}returntrue;}//数据检测:各列是否为15//当各列和为15时,返回true;否则,返回falseprivatebooleandataCheckSumColumn(){inti,j,k;for(i=0;i<board.length;i++){for(j=0,k=0;j<board[i].length;j++)//原文这一行有问题,已修正k+=board[j][i];if(k!=15)returnfalse;}returntrue;}//数据检测:总方法privatebooleandataCheck(){if(!dataCheckDifferent())returnfalse;if(!dataCheckSumRow())returnfalse;if(!dataCheckSumColumn())returnfalse;//检测对角线之和是否为15if(board[0][0]+board[1][1]+board[2][2]!=15)returnfalse;if(board[0][2]+board[1][1]+board[2][0]!=15)returnfalse;returntrue;}//求解并输出棋盘问题publicvoidarrange(){intn=1;for(dataInit();!dataEnd();dataNext())//关键步骤,括号内三个函数不理解{if(dataCheck())//条件满足,输出{System.out.println("第"+n+"个结果:");n++;outputGrid();}}}publicstaticvoidmain(String[]args){Grid15a=newGrid15();a.arrange();}}

解决方案

解决方案二:
http://blog.csdn.net/itlijunjie/article/details/12586261这里有些注释,参考一下
解决方案三:
你参考的程序也太"穷举"了吧?而且,我试过他的代码了,速度非常慢,中间还有停顿的现象。依我看,这个问题就其实两个关键步骤:第一步、全排列第二步、对于某一种排列,检测其是否符合魔方阵,符合的输出第二步好理解,剩下的就是“全排列”函数了,一个DFS算法即可搞定,而且比他的快多了publicclassAllPerm{publicstaticint[][]qipan=newint[3][3];publicstaticintcount=0;/**深度优先型全排列*/publicstaticvoidallPerm(int[]indexArray,intlevel){if(level==indexArray.length-1){//到达子节点检测、输出checkAndPrint(indexArray);}else{//递归第一个子节点allPerm(indexArray,level+1);for(inti=level+1;i<indexArray.length;i++){//提取前缀swap(indexArray,level,i);//递归对应子树allPerm(indexArray,level+1);//回溯swap(indexArray,level,i);}}}publicstaticvoidcheckAndPrint(int[]indexArray){intindex=0;for(inti=0;i<3;i++){for(intj=0;j<3;j++){qipan[i][j]=indexArray[index];index++;}}//行检测for(inti=0;i<3;i++){intsum=0;for(intj=0;j<3;j++){sum+=qipan[i][j];}if(sum!=15){return;}}//列检测for(intj=0;j<3;j++){intsum=0;for(inti=0;i<3;i++){sum+=qipan[i][j];}if(sum!=15){return;}}//对角线检测intsum=0;for(inti=0;i<3;i++){sum+=qipan[i][i];}if(sum!=15){return;}sum=0;for(inti=0;i<3;i++){sum+=qipan[i][2-i];}if(sum!=15){return;}count++;System.out.println("第"+count+"个结果:");for(inti=0;i<3;i++){for(intj=0;j<3;j++){System.out.print(qipan[i][j]+"");}System.out.println();}}publicstaticvoidswap(int[]array,inta,intb){inttemp=array[a];array[a]=array[b];array[b]=temp;}publicstaticvoidmain(String[]args){int[]indexArray=newint[9];for(inti=0;i<9;i++){indexArray[i]=i+1;}allPerm(indexArray,0);}}

时间: 2024-07-28 22:09:25

求助——求解和为15的游戏棋盘问题的相关文章

棋盘问题,求解和为15的棋盘游戏问题

问题描述 棋盘问题,求解和为15的棋盘游戏问题 求解和为15的棋盘游戏问题,求解和为15的棋盘游戏问题,求解和为15的棋盘游戏问题 解决方案 package chapter_four; public class J_Grid15 { int [] [] m_board; J_Grid15(){ m_board = new int [3][3]; } //输出棋盘的格线行 private void mb_outputGridRowBoard(){ int i; System.out.print("

编程-程序媛小白求助:C#贪吃蛇精灵游戏

问题描述 程序媛小白求助:C#贪吃蛇精灵游戏 我编了一个贪吃蛇的游戏,代码如下.编译无错误,但运行后蛇不会动啊~我真的真的不知道问题出在哪儿.多谢各位大神指教~ using System; using System.Collections; using System.ComponentModel; using System.Data; using System.Drawing; using System.Linq; using System.Text; using System.Threadin

欧美调查显示玩家15%的游戏时间属网游

Joystiq最近公布了一份由权威游戏业界观察网站GameIndustry进行的调查,这项调查向13000名欧洲和北美的游戏玩家询问他们的游戏时间分配状况.数据显示,总共的游戏时间中有15%都属于网络游戏,当然这个数字并非专指魔兽世界,不过考虑到魔兽世界在欧美庞大的市场占有率,可以相信这个比例中魔兽世界所占的份额会相当大. 具体到分布上,北美玩家14%的游戏时间花在了网游上,欧洲玩家则根据国家不同从8-16%都有.而14%的欧洲玩家曾经玩过网游,北美的数字则是21%(如果这个调查发生在中国,估计

win8 开发之旅(15) --足球游戏揭秘(1)

  足球游戏是一种喜闻乐见的游戏,当然了足球游戏,可以有难有易.难得可以做成像实况足球,fifa那样大型的3d游戏,简单的也只能模拟踢球的画面,球员用  圆圈,图形代表了.那我的足球游戏,也是这样的.具体情况,如图所示: 这是一个进行选择球队的界面,我的队伍是依据fifa2010世界杯分组的情况,也是一个splashgren window,缓冲界面,当你选择了那支球队以后,就跳到他与另外本组的另外的球队的比赛的情况去了,这也是严格按照世界杯的赛程走的. 譬如,我选择的是巴西队,他的第一场是对北朝

mfc求助-求解 mfc 开发提升的层次

问题描述 求解 mfc 开发提升的层次 我认为 1)基本的界面显示,会用基础的控件 2)会用复杂的控件,比如listctrl,treectrl 3) 涉及到多个窗口时,学会多个ipc方式,比如消息,比如共享内存等 4)具体到某个领域,如数据库,如导航 你认为啦?

高分求助: 求解一个关于数据算法的问题!

问题描述 ::::求一个节省代码的算法::::有0123456789十个数.要求打印出:2位数组合的数3位数组合的数4位数组合的数5位数组合的数6位数组合的数7位数组合的数8位数组合的数9位数组合的数10位数组合的数举个例子,比如2位数组合的数:00010203040506070809101112131415161718192021222324252627282930313233343536373839.............................909192939495969798

《极品飞车15:变速2》游戏发售日期正式确定

此次<极品飞车15:变速2>不仅将收录包括FIA GT1 & GT3的原形车辆在内,一共约140辆的车种,且将收录包括铃鹿等知名赛道. 另外,游戏中将有一次有十六台车同场竞技(对手十五台+玩家一台),同时也在游戏系统也增加了"Elite"物理模式,这个模式是提供喜爱硬派拟真系操控的玩家一个新的选择,也就是说,在此模式里的车辆操控物理将会更趋近于真车的操控,看来有和GT5一拼的意味.综观以上要素来看,<极品飞车 15:变速2>的内容将会是将近SHIFT一代

莎木UO时空之旅外媒评出15款创意超前的游戏

由外媒1up评选出来的创意超前游戏,这15个游戏可能并不都是名作,但其中有的是开创时代或游戏类型的先驱,有的让我们看到了崭新的游戏玩法.我们今天玩到的游戏中,不少创意都受到了它们的启发,它们超前的创意对今后的游戏也许还能产生影响. 15. Majestic 发行厂商:EA 发售日期:2001年 登陆平台:PC <Majestic>是最早一批ARG( Alternate Reality Games,既可以与现实交互的游戏)的先驱者,它不需要使用手柄之类的控制器来玩,而是借助于身边的一些通讯工具,

15款创意超前的游戏 你都玩过吗?

由外媒1up评选出来的创意超前游戏,这15个游戏可能并不都是名作,但其中有的是开创时代或游戏类型的先驱,有的让我们看到了崭新的游戏玩法.我们今天玩到的游戏中,不少创意都受到了它们的启发,它们超前的创意对今后的游戏也许还能产生影响. 15. Majestic 发行厂商:EA 发售日期:2001年 登陆平台:PC <Majestic>是最早一批ARG( Alternate Reality Games,既可以与现实交互的游戏)的先驱者,它不需要使用手柄之类的控制器来玩,而是借助于身边的一些通讯工具,