我的思路:
填完16后,要把坐标弄到17的位置,填完24后,要把坐标弄到25的位置
填完12后,要把坐标弄到13的位置
我的代码(不如题解中其他人的好):
#include <iostream>
#include <vector>
using namespace std;
int main()
{
int n, m;
cin >> n >> m;
vector<vector<int> >map(n, vector<int>(m));
int x = 0, y = 0; //横纵坐标
int num = 1; //目前的数字
int bh_length = 1; //要减去的长度(本解法是如果5*5矩阵,先4个4个去填数组)
while (1)
{ //上侧
for (int i = 0; i < m-bh_length; i++) //若5*5矩阵,先填4个,结束时,坐标正好到上侧的第5个
{
map[x][y++] = num++; //若填的数正好到题目要求的数,则跳出,goto到jieshu去输出矩阵
if (num == n * m + 1) //因为num采用后自增了,所以判断是否与n*m+1相等
{
goto jieshu;
}
}
//右侧
for (int i = 0; i < n-bh_length; i++) //若5*5矩阵,先填4个,结束时,坐标正好到右侧的第5个
{
map[x++][y] = num++; //若填的数正好到题目要求的数,则跳出,goto到jieshu去输出矩阵
if (num == n * m + 1) //因为num采用后自增了,所以判断是否与n*m+1相等
{
goto jieshu;
}
}
//下侧
for (int i = 0; i < m-bh_length; i++) //若5*5矩阵,先填4个,结束时,坐标正好到下侧的第5个(从右往左数)
{
map[x][y--] = num++; //若填的数正好到题目要求的数,则跳出,goto到jieshu去输出矩阵
if (num == n * m + 1) //因为num采用后自增了,所以判断是否与n*m+1相等
{
goto jieshu;
}
}
//左侧
for (int i = 0; i < n-bh_length; i++) //若5*5矩阵,先填4个,结束时,坐标正好到左侧的第5个(从下往上数)
{
map[x--][y] = num++; //若填的数正好到题目要求的数,则跳出,goto到jieshu去输出矩阵
if (num == n * m + 1) //因为num采用后自增了,所以判断是否与n*m+1相等
{
goto jieshu;
}
}
//注意,接下来,按照蛇形,该往右走了,调整坐标
x = x + 1; //横坐标往下移动1位
y = y + 1; //纵坐标往右移动1位,正好到"里层"
bh_length += 2; //要减去的长度加2
map[x][y] = num; //先在调整后的坐标填上数,注意这里num不能后自增,(这么做是为了考虑到"最里层就1个"的情况,如3*3,5*5矩阵
if (num == n * m)
{ //若填的数正好到题目要求的数,则跳出,goto到jieshu去输出矩阵
goto jieshu;
}
}
jieshu:
for (int i = 0; i < n; i++)
{
for (int j = 0; j < m; j++)
{
cout << map[i][j] << " ";
}
cout << endl;
}
return 0;
}