求助
  • 板块灌水区
  • 楼主封禁用户
  • 当前回复0
  • 已保存回复0
  • 发布时间2024/7/29 11:50
  • 上次更新2024/7/29 13:44:24
查看原帖
求助
973480
封禁用户楼主2024/7/29 11:50

问题描述
大家一定都听说过蛇形矩阵,也一定都听说过螺旋矩阵,但一定没有听过蛇形螺旋矩阵。所谓蛇形螺旋矩阵,是非常类似于螺旋矩阵的一种矩阵。它们仅有的不同之处在于:螺旋矩阵总是按顺时针方向旋转并填入相应数字,而蛇形螺旋矩阵每一圈的旋转方向是不固定的。

现在给出一个蛇形螺旋矩阵的大小,同时给出每一圈旋转的方向,请你制作出这个矩阵。(特别说明:第ii 圈的旋转是从 (i,i)(i,i) 处开始的。)

输入格式 第一行一个正整数 nn,表示蛇形螺旋矩阵的边长。

第二行
(n+1)/2(n+1)/2 个整数,第 ii 个数表示从外向内第 ii 圈的旋转的方向。11 表示顺时针方向,−1−1 表示逆时针方向。

输出格式
输出共 nn 行,每行 nn 个用空格隔开的正整数,第 ii 行第 jj 个整数表示这个矩阵 (i,j)(i,j) 处的应填的整数。

输入数据 1

7
1 -1 -1 1

输出数据 1

1 2 3 4 5 6 7
24 25 40 39 38 37 8
23 26 41 48 47 36 9
22 27 42 49 46 35 10
21 28 43 44 45 34 11
20 29 30 31 32 33 12
19 18 17 16 15 14 13

数据范围
对于 5050% 的数据,1≤n≤1001≤n≤100。

对于 100100% 的数据, 1≤n≤10001≤n≤1000。

#include<bits/stdc++.h>
using namespace std;
int a[1001][1001],b[1001];
int main(){
	int n,t=1,i,j,k=1;
	cin >> n;
	a[1][1]=t;
	i=1,j=1;
	for(int l=1;l<=(1+n)/2;l++) cin >> b[l];
	while(t<n*n){
		if(b[k]==1){//顺时针
			while(a[i][j+1]==0&&j<n) a[i][++j]=++t;
			while(a[i+1][j]==0&&i<n) a[++i][j]=++t;
			while(a[i][j-1]==0&&j>1) a[i][--j]=++t;
			while(a[i-1][j]==0&&i>1) a[--i][j]=++t;		
		}else{//逆时针
			while(a[i+1][j]==0&&i<n) a[++i][j]=++t;
			while(a[i][j+1]==0&&j<n) a[i][++j]=++t;
			while(a[i-1][j]==0&&i>1) a[--i][j]=++t;
			while(a[i][j-1]==0&&j>1) a[i][--j]=++t;	
		}
		k++;
	}
	for(int l=1;l<=n;l++){
		for(int m=1;m<=n;m++) cout << a[l][m] << " ";
		cout << endl;
	}
    return 0;
}
2024/7/29 11:50
加载中...