【听说有人想转码】循环数组之螺旋方阵

上题目

输入格式:

输入在一行中给出一个正整数N(<=30)。

输出格式:

输出N×N的螺旋方阵。每行N个数字,每个数字占3位。

输入样例:

10

结尾无空行

输出样例:

001 002 003 004 005 006 007 008 009 010
036 037 038 039 040 041 042 043 044 011
035 064 065 066 067 068 069 070 045 012
034 063 084 085 086 087 088 071 046 013
033 062 083 096 097 098 089 072 047 014
032 061 082 095 100 099 090 073 048 015
031 060 081 094 093 092 091 074 049 016
030 059 080 079 078 077 076 075 050 017
029 058 057 056 055 054 053 052 051 018
028 027 026 025 024 023 022 021 020 019

结尾无空行

这边注意,在最右边一列,数字后面没有空格。

每个数字要用0填成3位。

想了好几种解法,最后打算写一个函数,把n*n的方框填好,然后把n变成n-2,再把里面的框框填好 ,最后把这个n*n的数表填满。

#include <iostream>
using namespace std;
void set1(int i, int n, int& p, int a[30][30])
{
    a[i][i] = p++;
    int y = n - 1 - i,t;
    for (t = i + 1; t <= y; t++) { a[i][t] = p++; }
    for (t = i + 1; t <= y; t++) { a[t][y] = p++; }
    for (t = i + 1; t <= y; t++) { a[y][n-t-1] = p++; }
    for (t = i + 1; t <= y-1; t++) { a[n-1-t][i] = p++; }

}
int main()
{
    int n; cin >> n;
    int i, a[30][30], j=1;
    for(i=0;i<(1+n)/2;i++)
    {
        set1(i, n, j, a);
    }
    for (i = 0; i < n; i++)
    {
        for (j = 0; j < n; j++)
        {
            printf("%03d", a[i][j]);
            if (n - 1 - j)cout << " ";
            else cout << endl;
        }
    }
return 0;
}

我觉得函数那边的代码写的不够简练,其实四个for循环可以很对称,每个for循环写n-1个数。

也不打算改了。一开始先定a[n][n]是为了写的时候思路清晰,知道自己在那一行。

 printf("%03d", a[i][j]);这是用来输出001 017这种数的,%3d的话,会输出“  1  17”,%d的话,会输出“1 17”(大概是这样,没核对)。

希望之后能有优化方案。 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值