下图是一个4阶的螺旋数阵:
1 2 3 4
12 13 14 5
11 16 15 6
10 9 8 7
数字从1开始,沿着顺时针方向依次填满整个矩阵。
现在给你矩阵的规模n,请你输出n阶螺旋数阵。
输入包含多组数据,每组数据包含一个正整数n(1≤n≤20)。
对应每组数据,输出相应的螺旋数阵。
每组数据之后输出一个空行作为分隔。
3 4
1 2 3 8 9 4 7 6 5 1 2 3 4 12 13 14 5 11 16 15 6 10 9 8 7
#include <cstdio>
#include <vector>
using namespace std;
int main()
{
int n;
while (scanf("%d", &n) != EOF)
{
vector<vector<int>> mat(n, vector<int>(n));
int num = 1;
for (int step = 0; step < (n >> 1); ++step)
{
for (int j = step; j < n - step; ++j) mat[step][j] = num++;
for (int i = step + 1; i < n - step; ++i) mat[i][n - 1 - step] = num++;
for (int j = n - 2 - step; j >= step; --j) mat[n - 1 - step][j] = num++;
for (int i = n - 2 - step; i > step; --i) mat[i][step] = num++;
}
if (n & 1) mat[n >> 1][n >> 1] = num;
for (int i = 0; i < n; ++i)
{
for (int j = 0; j < n - 1; ++j)
printf("%d ", mat[i][j]);
printf("%d\n", mat[i][n - 1]);
}
printf("\n");
}
return 0;
}
#include <iostream> #include <vector> #include <algorithm> #include <unordered_set> using namespace std; int main(int argc, char** argv){ int n; while(cin >> n){ vector<vector<int>> temp(n, vector<int>(n, 0)); int begin_x = 0, begin_y = 0, end_x = n, end_y = n; int dx[4] = {0, 1, 0, -1}; int dy[4] = {1, 0, -1, 0}; int flag = 0; int x = 0, y = 0; int cur = 1; while(cur <= n*n){ if(x >= begin_x && x < end_x && y >= begin_y && y < end_y){ temp[x][y] = cur; cur++; x += dx[flag]; y += dy[flag]; } else{ if(flag == 0) begin_x++; else if(flag == 1) end_y--; else if(flag == 2) end_x--; else if(flag == 3) begin_y++; x -= dx[flag]; y -= dy[flag]; flag++; if(flag == 4) flag = 0; x += dx[flag]; y += dy[flag]; } } for(int i = 0; i < n; i++){ for(int j = 0; j < n; j++){ cout << temp[i][j] << " "; } cout << endl; } cout << endl; } return 0; }
1 . j+1<n判断是否到达边界,因为res[0][0]已经赋值了
while True: try: n = int(input()) res = [[0 for _ in range(n)] for _ in range(n)] tot,i,j=1,0,0 res[0][0] = tot while tot<n**2: while j+1<n and not res[i][j+1]: tot += 1 j+=1 res[i][j]=tot while i+1<n and not res[i+1][j]: tot += 1 i += 1 res[i][j]=tot while 1<=j and not res[i][j-1]: tot += 1 j -= 1 res[i][j]=tot while i >=1 and not res[i-1][j]: tot += 1 i -= 1 res[i][j]=tot for i in res: print(' '.join(map(str,i))) print() except:break
一个数组记录是否访问过,一个数组记录走法,同类型的题目不管出成什么样都一样
import sys
def generateMatrix(n):
res = [[0 for i in range(n)] for j in range(n)]
count = 1
rowIndex1 = 0
rowIndex2 = n - 1
colIndex1 = n - 1
colIndex2 = 0
rowNum = n
while rowNum >= 1:
for i in range(colIndex2, colIndex1 + 1):
res[rowIndex1][i] = count
count += 1
rowIndex1 += 1
for i in range(rowIndex1, rowIndex2 + 1):
res[i][colIndex1] = count
count += 1
colIndex1 -= 1
for i in range(colIndex1, colIndex2 - 1, -1):
res[rowIndex2][i] = count
count += 1
rowIndex2 -= 1
for i in range(rowIndex2, rowIndex1 - 1, -1):
res[i][colIndex2] = count
count += 1
colIndex2 += 1
rowNum -= 2
return res
for i in sys.stdin.readlines():
matrix = generateMatrix(int(i))
for line in matrix:
print(" ".join(map(str, line)))
print()
#include <iostream> #include <vector> using namespace std; int main() { int length; while (cin >> length) { vector<vector<int> > data(length, vector<int>(length, 0)); vector<int> number(length * 2 - 1, length); int cnt = 1; for (int i = 1; i < 2 * length - 1; i = i + 2) { number[i] = length - cnt; number[i + 1] = length - cnt; cnt++; } if (length == 1) { cout << 1 << endl << endl; continue; } else { cnt = 1; int i = 0, j = -1; for (int k = 0; k < 2 * length - 1; k++) { if (k % 4 == 0)//向右 { for (int x = 0; x < number[k]; x++) { j++; data[i][j] = cnt; cnt++; } } else if (k % 4 == 1)//向下 { for (int x = 0; x < number[k]; x++) { i++; data[i][j] = cnt; cnt++; } } else if (k % 4 == 2)//向左 { for (int x = 0; x < number[k]; x++) { j--; data[i][j] = cnt; cnt++; } } else //向上 { for (int x = 0; x < number[k]; x++) { i--; data[i][j] = cnt; cnt++; } } } } for (vector<vector<int> >::iterator it = data.begin(); it != data.end(); it++) { vector<int> res = *it; for (vector<int>::iterator k = res.begin(); k != res.end(); k++) { cout << *k; if (k != res.end() - 1) cout << " "; else cout << endl; } } cout << endl; } return 0; }
import java.util.*; public class Main { public static void main(String[] args) { Scanner sc = new Scanner(System.in); while (sc.hasNext()) { int n = sc.nextInt(); int[][] arr = new int[n][n]; int value = 1; //round为需要转的圈数.n为奇数时n/2+1圈,n为偶数时为n/2圈 for (int round = 0; round < n / 2 + n % 2; round ++ ) { for (int i = round; i < n - round; i ++ ) { // 左→右 arr[round][i] = value ++ ; } for (int i = round + 1; i < n - round; i ++ ) { // 上→下 arr[i][n - round - 1] = value ++ ; } for (int i = n - round - 2; i >= round; i -- ) { // 右→左 arr[n - round - 1][i] = value ++ ; } for (int i = n - round - 2; i >= round + 1; i -- ) { // 下→上 arr[i][round] = value ++ ; } } for (int i = 0; i < n; i ++ ) { for (int j = 0; j < n; j ++ ) { if(j == n - 1) System.out.println(arr[i][j]); else System.out.print(arr[i][j] + " "); } } System.out.println(); } } }
#include <iostream> #include <vector> using namespace std; int main() { int n; while (cin >> n && n) { vector<vector<int> > m(n, vector<int>(n)); int dir[4][2] = { {0,1},{1,0},{0,-1},{-1,0} }; int num = 1, sum = n - 1; for (int rou = 0; rou < (n + 1) / 2; ++rou) // 循环第几圈 { int x = rou, y = rou; for (int i = 0; i < 4; ++i) // →↓←↑四个方向循环 { for (int cou = 0; cou < sum; ++cou) // 每圈有几个数字(减1防止重复打印) { m[x][y] = num; // 打印 ++num; x += dir[i][0]; // 计算下一个位置 y += dir[i][1]; } } sum -= 2; // 经过一圈,个数减2 } if (n % 2) m[n / 2][n / 2] = n*n; // 奇数情况,打印中心位置 for (int i = 0; i < n; ++i) // 输出 { for (int j = 0; j < n; ++j) cout << (j ? " " : "") << m[i][j]; cout << endl; } cout << endl; // 每组打印一行空行 } return 0; }
#include "iostream" using namespace std; int main(void){ int E,S,W,N;//东南西北四个边界 int i,j,x,n; while(cin>>n){ N = W = 0; E = S = n-1; int a[n][n]; x = 1; while(N!=S && W!=E){ for(i=N,j=W;j<=E;) a[i][j++] = x++; N++; if(N==S && W==E) break; for(i=N,j=E;i<=S;) a[i++][j] = x++; E--; if(N==S && W==E) break; for(i=S,j=E;j>=W;) a[i][j--] = x++; S--; if(N==S && W==E) break; for(i=S,j=W;i>=N;) a[i--][j] = x++; W++; if(N==S && W==E) break; } a[N][W] = x; for(i=0;i<=n-1;i++){ for(j=0;j<=n-2;j++){ cout<<a[i][j]<<" "; //千万不要用ends,搞了半天通不过是因为这个。。。 } cout<<a[i][n-1]<<endl;//最后一个直接换行 } cout<<endl; } return 0; }