DFS(模拟) - 蛇形矩阵

DFS(模拟) - 蛇形矩阵

题意:

给 定 矩 阵 的 行 和 列 , 分 别 为 n 和 m , 按 照 蛇 形 矩 阵 的 形 式 打 印 这 个 矩 阵 。 给定矩阵的行和列,分别为n和m,按照蛇形矩阵的形式打印这个矩阵。 nm

数据范围

1≤n,m≤100

输入样例:

3 3

输出样例:

1 2 3
8 9 4
7 6 5

分析:

d i r 控 制 填 充 矩 阵 的 方 向 , ( x , y ) 表 示 在 矩 阵 中 的 位 置 , 递 归 去 填 充 矩 阵 即 可 。 dir控制填充矩阵的方向,(x,y)表示在矩阵中的位置,递归去填充矩阵即可。 dir(x,y)

注 意 , 要 控 制 填 充 的 边 界 。 事 实 上 我 们 是 由 外 向 里 , 逐 层 填 充 的 , 这 是 一 个 递 归 的 过 程 。 注意,要控制填充的边界。事实上我们是由外向里,逐层填充的,这是一个递归的过程。

每 填 充 一 条 边 后 , 要 把 边 界 相 应 的 减 小 。 每填充一条边后,要把边界相应的减小。

代码:

#include<iostream>

using namespace std;

const int N = 110;

int n, m;
int f[N][N];
int d[5][2]={{0,0}, {0,1}, {1,0}, {0,-1}, {-1,0}};  //R D L U
int U, D, L, R;

void dfs(int dir, int x, int y, int u)
{
    if(u > n*m) return ;
    
    f[x][y] = u;
    if(y == R && dir == 1) 
    {
        U ++;
        dfs(2, x+1, y, ++u);
    }
    else if(x == D && dir == 2)
    {
        R --;
        dfs(3, x, y-1, ++u);
    }
    else if(y == L && dir == 3)
    {
        D --;
        dfs(4, x-1, y, ++u);
    }
    else if(x == U && dir == 4)
    {
        L ++;
        dfs(1, x, y+1, ++u);
    }
    else dfs(dir, x+d[dir][0], y+d[dir][1], ++u);
}

void print()
{
    for(int i=1;i<=n;i++)
    {
        for(int j=1;j<=m;j++)
            cout<<f[i][j]<<' ';
        cout<<endl;
    }
}

int main()
{
    ios::sync_with_stdio(false);
    
    cin>>n>>m;
    L = U = 1, R = m, D = n;
    dfs(1,1,1,1);
    print();
    
    return 0;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值