DFS(模拟) - 蛇形矩阵
题意:
给 定 矩 阵 的 行 和 列 , 分 别 为 n 和 m , 按 照 蛇 形 矩 阵 的 形 式 打 印 这 个 矩 阵 。 给定矩阵的行和列,分别为n和m,按照蛇形矩阵的形式打印这个矩阵。 给定矩阵的行和列,分别为n和m,按照蛇形矩阵的形式打印这个矩阵。
数据范围
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;
}