回顾:螺旋打印数组
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();
}
以上是关于回顾:螺旋打印数组的主要内容,如果未能解决你的问题,请参考以下文章