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个数环绕排出来的距形

解决方案 »

  1.   

    思路:
    1.根据参数n建立二维数组,初始值为0
    2.判断起始点坐标,x_0,y_0
    3.开始循环赋值,坐标变换依次为 x+1 , y+1 ,x-1,y-1 ,
    4.如果目标赋值节点不为0,则重复上一步的坐标变换行为。
    5.坐标到达边界的时候停止循环
      

  2.   

    是啊,就是一圈一圈,然后把圈拆分了,每个圈拆成4步,然后就是找规律了。你看这个示意图,分下n为奇偶,按照“红-紫-黄-绿”的顺序走就行了。麻烦点的,可以根据上图的规律,一圈圈回填,找好规律就行。当n为偶数,一共绕n/2圈,每圈分四步,第i圈的步长是2*i-1。
    当n为奇数,去除中心的1不算,一共绕(n-1)/2圈,每圈分四步,第i圈的步长是2*i。
      

  3.   


    <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>
      

  4.   

    经过分析我觉得棒棒糖其实只有两种情况:
    如图红箭头是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>