回顾:螺旋打印数组

Posted nonames

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了回顾:螺旋打印数组相关的知识,希望对你有一定的参考价值。

题意:给出一个n*m数组,要求顺时针螺旋打印该数组。

输入
3 4
1 2 3 4
5 6 7 8
9 10 11 12

输出

1 2 3 4 8 12 11 10 9 5 6 7

两种方法:
1、递归,控制方向,不能再移动时则改变方向,如果改变方向后仍然不能移动表示打印结束。
2、四个while循环,一直循环打印符合条件的数且未访问过的数,直到打印次数等于n*m。

#include<bits/stdc++.h>
#define rep(i , j , n) for(int i = j ; i <= n ; i++)
using namespace std;
const int maxn = 1e2+9;
int n , m ;
int a[maxn][maxn];
int vis[maxn][maxn];
int dir[4][2] = {{0,1},{1,0},{0,-1},{-1,0}};
void dfs(int x , int y , int di){//方法1递归
    if(x > n || y > m || x <= 0 || y <= 0 || vis[x][y]) return ;
    vis[x][y] = 1 ;
    cout << a[x][y] << " " ;
    rep(i , 0 , 1){//i=1时表示要转弯了
        di = (di+i)%4;
        int xx = x + dir[di][0];
        int yy = y + dir[di][1];
        dfs(xx , yy , di);
    }
}
void solve(){
    scanf("%lld%lld" , &n , &m);
    rep(i , 1 , n){
        rep(j , 1 , m){
            cin >> a[i][j];
        }
    }
    //dfs(1 , 1 , 0);//方法2模拟
    int i = 1 , j = 0 , num = 0;
    while(true){
        while(j+1 <= m && !vis[i][j+1]) vis[i][++j] = 1 ,cout << a[i][j] << " ", num++;
        while(i+1 <= n && !vis[i+1][j]) vis[++i][j] = 1 ,cout << a[i][j] << " ", num++;
        while(j-1 > 0  && !vis[i][j-1]) vis[i][--j] = 1 ,cout << a[i][j] << " ", num++;
        while(i-1 > 0  && !vis[i-1][j]) vis[--i][j] = 1 ,cout << a[i][j] << " ", num++;
        if(num == n*m) break;
    }
    cout << endl;
}

signed main()
{
    solve();
}

以上是关于回顾:螺旋打印数组的主要内容,如果未能解决你的问题,请参考以下文章

顺时针和逆时针螺旋打印二维数组(行列式)

螺旋打印2D数组

刷题精选:顺时针输出递增数组(螺旋递增升天数组)

刷题精选:顺时针输出递增数组(螺旋递增升天数组)

刷题精选:顺时针输出递增数组(螺旋递增升天数组)

Java 实现顺时针螺旋二维数组输出