n = 1 得出:1n = 2 得出:1 2
4 3n = 3 得出:7 8 9
6 1 2
5 4 3n = 4 得出:7 8 9 10
6 1 2 11
5 4 3 12
16 15 14 13n = 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个数环绕排出来的距形
4 3n = 3 得出:7 8 9
6 1 2
5 4 3n = 4 得出:7 8 9 10
6 1 2 11
5 4 3 12
16 15 14 13n = 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个数环绕排出来的距形
1.根据参数n建立二维数组,初始值为0
2.判断起始点坐标,x_0,y_0
3.开始循环赋值,坐标变换依次为 x+1 , y+1 ,x-1,y-1 ,
4.如果目标赋值节点不为0,则重复上一步的坐标变换行为。
5.坐标到达边界的时候停止循环
当n为奇数,去除中心的1不算,一共绕(n-1)/2圈,每圈分四步,第i圈的步长是2*i。
<script>
function getJz(n){
var jz=new Array;
for(var i=0;i<n;i++){
var tmp=new Array;
for(var j=0;j<n;j++){
tmp[j]=0;
}
jz[i]=tmp;
}
//alert(jz);
if(n%2==0){
var x=n-1;
var y=0;
var direct='r';
}else{
var x=0;
var y=n-1;
var direct='l';
}
var start=n*n;
for(var i=start;i>0;i--){
if(jz[x][y]==0){
var tmp_x=x;
var tmp_y=y;
}else{
if(direct=='l'){
if(y-1>=0&&jz[x][y-1]==0){
y--;
}else{
direct='d';
}
}
if(direct=='d'){
if(x+1<n&&jz[x+1][y]==0){
x++;
}else{
direct='r';
}
}
if(direct=='r'){
if(y+1<n&&jz[x][y+1]==0){
y++;
}else{
direct='u';
}
}
if(direct=='u'){
if(x-1>=0&&jz[x-1][y]==0){
x--;
}else{
direct='l';
if(y-1>=0&&jz[x][y-1]==0){
y--;
}else{
direct='d';
}
}
}
}
tmp_x=x;
tmp_y=y;
jz[tmp_x][tmp_y]=i;
}
document.write('<table border=1>');
for(var i=0;i<n;i++){
document.write('<tr id=tr'+i+'>');
for(var j=0;j<n;j++){
document.write('<td id=td'+jz[i][j]+'>'+jz[i][j]+'</td>');
}
document.write('</tr>');
}
document.write('</table>');
}
getJz(6);
getJz(5);
</script>
如图红箭头是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>