![](https://i-blog.csdnimg.cn/blog_migrate/574f6a84b17bf9ea1b55b6e527c9a709.png)
这道题的难点主要在于蛇形输入数字到这个矩阵中
碰到边界需要转向的只有一开始的三次转向
分别是向右走b坐标碰到边界、向下走a坐标碰到边界、向左走b坐标走到1的时候
后面转向的原因都是因为碰到数字
值得注意的是b的初始值是0,如果是1的话就会执行向右走的操作变成2
那么1,1的点就覆盖不到
#include<iostream>
using namespace std;
int n, m, dy[4] = { 1,0,-1,0 }, dx[4] = { 0,1,0,-1 };//方向数组分别向右、下、左、上走
int g[105][105],a=1,b=0,d,k=1;//a,b分别代表横纵坐标,k代表输入的数字
int main()
{
cin >> n>>m;
for (int i = 1; i <= n * m; i++)
{
if ((a == n && d == 1) ||(b<=1&&d==2)|| (b == m && d == 0) || g[a + dx[d]][b + dy[d]] != 0)//遇到一开始的边界或者下一个碰到数字就转向
{
d++;
if (d == 4)//如果四个方向都转过了就重置方向
{
d = 0;
}
}
a += dx[d];
b += dy[d];
g[a][b] = k;
k++;
}
for (int i = 1; i <=n; i++)
{
for (int j = 1; j <= m; j++)
{
cout << g[i][j] << " ";
}
cout << "\n";//注意每输入m次要换行
}
return 0;
}