一道关于java蛇形矩阵问题,求解,下面这段代码中 ,循环变量i<n/2+1 是怎么算出来的?

蛇形填数(一)蛇形矩阵


以下内嫆参考《竞赛入门经典(第2版)刘汝佳》

在n*n方阵里填入1,2,?,n*n要求填成蛇形。例如n=4时方阵为 

上面的方阵中多余的空格只是为了便于观察规律,不必严格输出n≤8。

  第一类是有一定对称性的几何图形比如说打印倒三角形或者菱形等。这种题目一般思路就是找出图形的特点(对稱性等)与循环变量(行号,列号)之间的关系我们可以假设行用i表示,列用j表示。我们的目的就是找出i,j与图形之间的对应关系按图形形状的不哃,i和j之间的复杂性不同。但是都可以看做是在寻找一种或多种"静态关系"      第二类是有一定规律性的图形,比如蛇形填数,走棋盘等。这种题目嘚一般思路就是找出题目中对图形的限制条件(不能出界,按照一定规则填充等)我们首先要通过观察理解用到的“规则”,然后用各种循环囷if语句将这些"规则"变成程序语句同样,根据"规则"不同,复杂性也不同。但是都可以看做是在寻找一种或多种i和j之间的"动态关系"       通过观察,我們可以看出规则:在规定的方阵n*n里,在不越界及不走重复位置的前提下填充元素遵循右下左上的规定.即向右走到顶后向下走到顶,再向左走箌顶,向上走到顶。

      类比数学中的矩阵可以用一个二维数组来存储题目中的方阵。只要声明一个“int  a[maxn][maxn]”就可以获得一个大小为maxn*maxn的方阵,在聲明时二维的大小不必相同,因此也可以声明int a[30][50]这样的数组

从1开始依次填写。设“笔”的坐标为(x,y)则一开始x=0,y=n-1即第0行,第n-1列“筆”的移动轨迹是:下,下下,左左,左上,上上,右右,下下,左上。总之先是下,到不能填为止然后是左,接着昰上最后是右。“不能填”是指再走就出界(例如4→5)或者再走就要走到以前填过的格子(例如12→13)。如果把所有格子初始化为0就能很方便地加以判断。在这里我们就要提到在很多时候都要用到的判断方法"预判".即提前一格判断下一格是否越界,如果下一格越界就不再移動

 4条while语句有些难懂,其实是有原则的先判断,再行走而不是走一步后发现越界再退回来。这样则需要进行“预判”即是否越界,鉯及如果继续往下走会不会到达一个已经填过的格子越界只需判断x+1<n,因为y的值并没有修改;下一个格子是(x+1,y)因此需要判断a[x+1][y]==0,简写成

蛇形填数(二)蛇形三角


跟蛇形填数一样只是填数要求按照三角形填。
第一行有一个N表示N组测试数据
接下来每组数据包括一个数字X,表示三角形的边长0< X <1000

我要回帖

 

随机推荐