zoukankan      html  css  js  c++  java
  • 回顾:螺旋打印数组

    题意:给出一个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();
    }
    
  • 相关阅读:
    js试题
    JavaScript 实现removeElement函数
    关于优化
    变量申明的提升,闭包,作用域,this,运算符优先级详细举例及讲解
    前端架构:MVC以及MVVM MVP介绍
    JavaScript事件委托
    各种浏览器的Hack写法(chrome firefox ie等)
    vue页面跳转不刷新时created只执行一次
    iview-admin添加的路由为英文
    vue中使用moment时间戳
  • 原文地址:https://www.cnblogs.com/nonames/p/12729112.html
Copyright © 2011-2022 走看看