读书人

【大神们求算法!】,该如何解决

发布时间: 2013-06-19 10:26:41 作者: rapoo

【大神们求算法!!】
n = 1 得出:

1

n = 2 得出:

1 2
4 3

n = 3 得出:

7 8 9
6 1 2
5 4 3

n = 4 得出:

7 8 9 10
6 1 2 11
5 4 3 12
16 15 14 13

n = 5 得出:

21 22 23 24 25
20 7 8 9 10
19 6 1 2 11
18 5 4 3 12
17 16 15 14 13

大神应该明白吧,就是n*n个数环绕排出来的距形

麻烦点的,可以根据上图的规律,一圈圈回填,找好规律就行。

当n为偶数,一共绕n/2圈,每圈分四步,第i圈的步长是2*i-1。
当n为奇数,去除中心的1不算,一共绕(n-1)/2圈,每圈分四步,第i圈的步长是2*i。
[解决办法]

经过分析我觉得棒棒糖其实只有两种情况:
如图红箭头是n为偶数时:只要在每行最后增加一个数,数的大小从(n-1)*(n-1)+1开始;然后增加一行,数字是继前面的数值增加。
黄色箭头是n为奇数时:只要在每行前面增加一个数,数是从下向上的,大小也是从(n-1)*(n-1)+1开始;然后在最上面增加一行。
我们把这个表格用二维数组表示,解决起来就简单了。
<script type="text/javascript"> 


function bubble(n){
var X=[];
function add(l){
var b=(l-1)*(l-1),arr=[],i=0;
if(l%2==0){
for(;i< X.length;i++){
b++;
X[i].push(b);//最右边添加一个数
}
for(i=l-1;i>=0;i--){
b++;
arr[i]=b;//最后一行的数组
}
X[X.length]=arr;//最下一行数组加入二维数组里
}else{
for(i=X.length;i>0;i--){
b++;
X[i-1].unshift(b);//上一行数组向下移一行,并最左边添加一个数
X[i]=X[i-1];
}
for(i=0;i<l;i++){
b++;
arr[i]=b;
}
X[0]=arr;//最上面添加一行数组加入二维数组里
}
}
for(var o=1;o<=n;o++){
add(o);//棒棒糖不断的绕大
}
document.write('<table border=1>');
for(var i=0;i< X.length;i++){
document.write('<tr>');
for(var j=0;j<X[i].length;j++){
document.write('<td align="center">'+X[i][j]+'</td>');
}
document.write('</tr>');
}
document.write('</table>');
}
bubble(6);
bubble(7);
bubble(8);
bubble(9);
bubble(10);
</script>

读书人网 >JavaScript

热点推荐