zoukankan      html  css  js  c++  java
  • 《算法设计与分析》:构造螺旋阵

    螺旋阵:任意给定n*n值,按如下螺旋的方式输出方阵: n=3    输出:   1    8   7 2    9   6 3    4   5 n=4    输出:  1    12  11  10 2    13  16  9 3    14  15  8 4    5    6    7 思路: 1) 引入变量k,表示在某一方向的上数据的个数,k的初值是n 2) 每当数据存放到左下角时,k减1 3) 存放到右上角时,k再减1 4) 引入符号变量t,初值为+1,表示处理前半圈:左侧i向下变大,j向右变大 5) t变为-1:表示处理后半圈:右侧i向上变小,j向左变小 6) 于是一圈内下标的变化情况如下: j=1   i=i+t  1----n       k=n i=n   j=j+t  2----n      前半圈共2*k-1个 t= -t              k=k-1 j=n   i=i+t   n-1----1 i=1   j=j+t   n-1----2    后半圈共2*k-1个 t= -t                k=k-1 7) 用x模拟“摆放”的数据;用y(1~2*k-1)作循环变量,模拟半圈内数据的处理的过程。 8) 引入b[0]表示数组的行下标,b[1]表示数组的列下表,前半圈y<=k,y/(k+1)=0,后半圈,y/(k+1)=1,则b[y/(k+1)]=b[y/(k+1)]+t可代表半圈下标的变化   代码:  
    #include 
    #include 
    using namespace std;
    int main(){
        int a[10][10];
        int n;
        scanf("%d",&n);
        memset(a, 0, sizeof(a));
        int x = 1;
        int t = 1;
        int k = n;
        int b[2] = {0, 1};
        while(x <= n * n){
            for (int y = 1; y <= 2*k-1; y ++){
                b[y/(k+1)] = b[y/(k+1)] + t;
                a[b[0]][b[1]] = x ++;
            }
            k --,   t = -1 * t;
        }
        for (int i = 1; i <= n; i ++){
            for (int j = 1; j <= n - 1; j ++){
                printf("%d ",a[i][j]);
            }
            printf("%d\n",a[i][n]);
        }
        return 0;
    }
    
     
    举杯独醉,饮罢飞雪,茫然又一年岁。 ------AbandonZHANG
  • 相关阅读:
    删除mysql服务
    取消jQuery validate验证
    评估期已过.有关如何升级您的测试软件
    修复fiddler无法抓包抓取https问题
    Win10开启高性能模式
    cmd git批量检出当前目录下的所有模块指定远程分支
    解决代码没有编译错误运行却报错: “程序包xxx不存在“的问题,最终解决办法
    尾递归
    idea Project maven根目录不见了找回
    秒转时分秒
  • 原文地址:https://www.cnblogs.com/AbandonZHANG/p/4114191.html
Copyright © 2011-2022 走看看