打印矩阵 Z字形打印数组
问题描述:
在图像编码的算法中,需要将一个给定的方形矩阵进行 Z 字形扫描(Zigzag Scan)。
给定一个
n
×
n
n \times n
n×n 的矩阵,
Z
Z
Z 字形扫描的过程如下图所示:
对于下面的4
×
\times
× 4的矩阵,
1 5 3 9
3 7 5 6
9 7 6 4
7 3 1 3
对其进行
Z
Z
Z 字形扫描后得到长度为
16
16
16 的序列:1 5 3 9 7 3 9 5 4 7 3 6 6 4 1 3
。
请实现一个 Z Z Z字形扫描的程序,给定一个 n × n n \times n n×n 的矩阵,输出对这个矩阵进行 Z 字形扫描的结果。
输入格式
输入的第一行包含一个整数
n
n
n,表示矩阵的大小。
输入的第二行到第 n + 1 n+1 n+1 行每行包含 n n n 个正整数,由空格分隔,表示给定的矩阵。
输出格式
输出一行,包含
n
×
n
n \times n
n×n 个整数,由空格分隔,表示输入的矩阵经过
Z
Z
Z 字形扫描后的结果。
数据范围
1
≤
n
≤
500
1 \leq n \leq 500
1≤n≤500,
矩阵元素为不超过
1000
1000
1000 的正整数。
输入样例:
4
1 5 3 9
3 7 5 6
9 4 6 4
7 3 1 3
输出样例:
1 5 3 9 7 3 9 5 4 7 3 6 6 4 1 3
#include<bits/stdc++.h>
using namespace std;
const int N = 5e2+10;
int q[N][N];
int main(){
int n ;
scanf("%d",&n);
for(int i = 1 ; i <=n ; i++){
for(int j = 1 ;j <=n ; j++){
scanf("%d",&q[i][j]);
}
}// 数据输入
for(int i = 2 ;i <=2*n ; i++ ){
if(i%2){ // 方向从下到上
for(int j = 1; j< i ; j++){
if(j>=1 && j<=n && i-j>=1 && i-j<=n ){ // x = j ,y = i-j,不超过边界
printf("%d ",q[j][i-j]);
}
}
}else{// 方向从上到下
for(int j = i-1 ; j ; j--){
if(j >=1 && j<=n && i -j >=1 && i - j <=n ){
printf("%d ",q[j][i-j]);
}
}
}
}
return 0 ;
}
作者:yxc
链接:https://www.acwing.com/activity/content/code/content/870331/
来源:AcWing
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
类试题:Leetcode:498. 对角线遍历
通过代码如下:
class Solution {
public:
vector<int> findDiagonalOrder(vector<vector<int>>& matrix) {
int m = matrix.size(), n = matrix[0].size() ;
vector<int> res;
for(int i = 0 ; i< m + n ;i ++ ){
if(i %2) {
// j =x , y = i - j
for(int j = 0 ; j <= i ; j ++){
if(j >= 0 && j < m && i-j>=0 && i-j <n){
// printf("%d %d \n",j,i);
res.push_back(matrix[j][i-j]);
}
}
}
else{
for(int j = i ; j >= 0 ; j --){
if(j >= 0 && j < m && i-j>=0 && i-j <n){
res.push_back(matrix[j][i-j]);
}
}
}
}
return res;
}
};
输入两个整数 n 和 m,输出一个 n n n 行 m m m列的矩阵,将数字 1 1 1 到 n × m n\times m n×m 按照回字蛇形填充至矩阵中。
具体矩阵形式可参考样例。
输入格式
输入共一行,包含两个整数
n
n
n 和
m
m
m。
输出格式
输出满足要求的矩阵。
矩阵占 n n n行,每行包含 m m m 个空格隔开的整数。
数据范围
1
≤
n
,
m
≤
100
1\leq n,m\leq100
1≤n,m≤100
输入样例:
3 3
输出样例:
1 2 3
8 9 4
7 6 5
#include<bits/stdc++.h>
using namespace std;
const int N =1e2+10;
int q[N][N];
int n,m;
int main(){
scanf("%d%d",&n,&m);
int x = 0 , y = 0 , d = 1;
int dx[]= {-1,0,1,0} , dy[] = {0,1,0,-1};
for(int i = 1 ; i<=n*m ; i++){
q[x][y] = i;
int xn = x + dx[d] , yn = y+dy[d];
if(xn < 0 || xn >= n || yn <0 || yn >= m|| q[xn][yn] ){
d = (d+1)%4;
xn = x + dx[d] , yn = y+dy[d];
}
x = xn, y = yn;
}
for(int i = 0 ; i< n ;i ++){
for(int j = 0 ;j < m ; j++ ){
printf("%d " ,q[i][j] );
}
printf("\n");
}
return 0;
}
class Solution {
public:
vector<int> spiralOrder(vector<vector<int>>& matrix) {
vector<int> res;
if(matrix.size() == 0|| matrix[0].size()==0) return res;
int n = matrix.size(),m = matrix[0].size();
vector<vector<bool>> st(n,vector<bool>(m,false));
int dx[] = {-1,0,1,0},dy[] = {0,1,0,-1};
int x = 0 ,y = 0,d = 1;
for(int i = 1 ; i<= n*m ; i++){
res.push_back(matrix[x][y]);
st[x][y] = true;
int xn = x+dx[d],yn = y+dy[d];
if(xn<0 || xn>=n || yn<0 || yn>=m || st[xn][yn]){
d = (d+1)%4;
xn = x+dx[d],yn = y+dy[d];
}
x = xn,y = yn;
}
return res;
}
};