上题目
输入格式:
输入在一行中给出一个正整数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”(大概是这样,没核对)。
希望之后能有优化方案。