首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > JAVA > J2SE开发 >

这个九宫格的程序有两处地方看不懂,该怎么解决

2012-02-17 
这个九宫格的程序有两处地方看不懂题目是:三横三竖的九宫格里面,填上从1-9九个数,要求每列的和为15,每行的

这个九宫格的程序有两处地方看不懂
题目是:三横三竖的九宫格里面,填上从1-9九个数,要求每列的和为15,每行的和为15,两条对角线上的数的和为15,而且这九个数没有重复的。在九宫格里输出这九个数。

这是教材上的一个例子,下面是源代码:

[code=Java][/code]
public class J_Grid15
{
  int[][] m_board;
J_Grid15()
{
m_board = new int[3][3];
}

private void mb_outputGridRowBoard()
{
int i;
System.out.print("+");
for(i=0; i<5; i++)
{
System.out.print("-");
}
System.out.println("+");
} // 输出九宫格的横段 +-----+

private void mb_outputGridRowBoard(int i)
{
int j;
for(j=0; j < m_board[i].length; j++)
{
System.out.print("|" + m_board[i][j]);
}
System.out.println("|");
} //画九宫格里的小竖线

public void mb_outputGrid()
{
int i;
mb_outputGridRowBoard();
for(i = 0; i < m_board.length; i++)
{
mb_outputGridRowBoard(i);
mb_outputGridRowBoard();
}
} // 输出整个九宫格+九宫格里面的数据


private void mb_dataInit()
{
int i, j, k;
for(i = 0, k = 1; i < m_board.length; i++)
{
for(j = 0; j < m_board[i].length; j++, k++)
{
m_board[i][j] = k;
}
}
} //初始化九宫格:1 2 3
  4 5 6
  7 8 9

private boolean mb_dataEnd()
{
int i, j, k;
for(i = 0, k = 9; i < m_board.length; i++)
{
for(j = 0; j < m_board[i].length; j++, k--)
{
if(m_board[i][j] != k)
return false;
}
}
return true;
} // 看不懂???

private void mb_dataNext()
{
int i, j;
for(i = m_board.length-1; i >= 0; i--)
{
for(j = m_board[i].length-1; j >= 0; j--)
{
if(m_board[i][j] == 9)
m_board[i][j] = 1;
else
{
m_board[i][j]++;
return;
}
}
}
} //看不懂???

private boolean mb_dataCheckDifferent()
{
int i, j;
int[] digit = new int [10];
for(i = 0; i < m_board.length; i++)
{
for(j = 0; j < m_board[i].length; j++)
{
digit[m_board[i][j]] = 1;
}
}
for(i = 0, j = 0; i < digit.length; i++)
{
  j += digit[i];
}
if(j == 9)
return false;
return true;
} // 检查九宫格里的九个数据是否有相同的

private boolean mb_dataCheckSumRow()
{
int i, j, k;
for(i = 0; i < m_board.length; i++)
{
for(j = 0, k = 0; j < m_board[i].length; j++)
{
k += m_board[i][j];
}
if(k != 15)
return false;
}
return true;
} //检查每行的和是否为15

private boolean mb_dataCheckSumColumn()
{
int i, j, k;
for(i = 0; i < m_board.length; i++)
{
for(j = 0, k = 0; j < m_board[i].length; j++)
{
k += m_board[j][i];
}
if(k != 15)
return false;
}
return true;
} //检查每列的和是否为15

private boolean mb_dataCheck()
{
if(mb_dataCheckDifferent())
return false;
if(!mb_dataCheckSumRow())
return false;
if(!mb_dataCheckSumColumn())
return false;
if(m_board[0][0] + m_board[1][1] + m_board[2][2] != 15)
return false;
if(m_board[0][2] + m_board[1][1] + m_board[2][0] != 15)
return false;
return true;
} //检查数据是否合法

public void mb_arrange()
{
int n = 1;
for(mb_dataInit(); !mb_dataEnd(); mb_dataNext())
  //判断条件!mb_dataEnd()和mb_dataNext()不是太明白
{
if(mb_dataCheck())
{
System.out.println("The " + n + "th result:");


n++;
mb_outputGrid();
}
}
}

public static void main(String args[])
{
J_Grid15 a = new J_Grid15();
a.mb_arrange();
}
}

下面是输出的两个结果:(还有6个结果,没有贴上来)
The 1th result:
+-----+
|2|7|6|
+-----+
|9|5|1|
+-----+
|4|3|8|
+-----+
The 2th result:
+-----+
|2|9|4|
+-----+
|7|5|3|
+-----+
|6|1|8|
+-----+

各位给解释解释,感激不尽

[解决办法]

探讨

怎样让发的帖子里的代码语法着色?

[解决办法]
9宫的算法很简单,记得以前数据结构的书里有例子,其实只要你理解了算法的基本规律,你就理解代码了
| | | | | | |3|
----+-----+----
| | |2|7|6|2|
----+-----+----
| | |9|5|1|
----+-----+
| |8|4|3|8|
----+-----+
|7|

基本规律就是,
首先,规律1,沿着对角3个数3个数的数,当某个数超过9宫格子的边界,就把该数换到另一个边界
比如2,超过了9宫的右边界1个格子,所以把它重新放到左边起第一列格子,3超过了右边界2个格子,所以把它重新放到左边起第二列格子,同时它超过了上边界一个格子,所以把它重新放放到下边界起第一行格子,同理,7,8一样
其次,规律2,每次数3个数的时候,比如123数完,数456的时候,4的开始位置要在1的偏移一行一列位置开始,同理789的7也要在4的偏移一行一列位置开始,如果发生格子越界,遵循规律1
最后,规律3,5一定是放在中间的格子,所以456位置基本可定。
再来看数数的方向,也就是对角线方向,对角线方向可以左下往右上,可以从右上往左下,可以从右下往左上,可以从左上往右下,所以就存在多种情况


题外话,采用格式发代码,点回复内容框的上面的那排有#符号的图标,就会让你选择代码语言,选中一种语言,就会有一对标签被写入到回复内容框,把你的代码贴在这对标签中即可

热点排行
Bad Request.