看到题目,这道题没有复杂的数据结构和高级算法;看起来似乎是个很简单的问题,但是其中有多层循环,已经大量的边界判定条件等。
思路:
如图:打印顺序是:上面一行—>右边一列 —–> 下面一行——>左边一列;知道图里的空白格都变成彩色;
我们用x,y 控制上面和左边的边界;end_row,end_col控制下面和右边的边界;
开始时:x=0; y=0; end_row=4;end_col=7;
打印一圈;
x++, y++; end_row–, end_col–
在打印一圈
….
当x=end_row时:只剩最后1行;y=end_col时:只剩最后1列;
以上这是整体的循环逻辑;
现在,在整体循环逻辑下,我们要打印,上一行,右一列,下一行,左一列;用m,n控制当前行,列的每个元素,然后循环打印上下行,左右列;
m = x;
n = y;
第一步:
打印上面一行(当前行由x决定):
while(n != end_col)
//打印array[x][n++];注意:当前所在行是由x决定的,所以行是x
第二步:
打印右一列(当前列由end_col决定)
while(m != end_row)
//打印a[m++][end]
第三步:
打印下面一行(当前行由end_row决定)
while(n != y)
//打印a[end_row][n--];因为是从右向左打印,在第一步结束后,n等于end_col
第四步:
打印左边一列(当前列由y决定)
while(m != x)
//打印a[m--][y];因为是从下往上打印,第二步结束后,m等于end_col
以下是整体代码:
void Fun(vector<vector<int>> a)
{
if (a.size() == 0)
return;
int row = a.size();
int col = a[0].size();
int x = 0;
int y = 0;
int end_row = row - 1;
int end_col = col - 1;
while (x <= end_row&&y <= end_col)
{
//只有一行(两种情况:矩阵本身只有一行 + 矩阵只会剩下一行需打印)
if (x == end_row)
{
for (int i = y; i <= end_col; ++i)
cout << a[x][i]<<" ";
}
//只有一列(两种情况: 矩阵本身只有一列 + 矩阵只剩下一列需打印)
else if (y == end_col)
{
for (int i = x; i <= end_row;++i)
cout << a[i][y] << " ";
}
else
{
int x1 = x;
int y1 = y;
//打印上面一行
while (y1 != end_col)
cout << a[x][y1++]<<" ";
//打印右面一列
while (x1 != end_row)
cout << a[x1++][end_col] << " ";
//在打印下面一行
while (y1 != y)
cout << a[end_row][y1--] << " ";
//在打印左面一列
while (x1 != x)
cout << a[x1--][y] << " ";
}
x++;
y++;
end_row--;
end_col--;
}
}
int main()
{
vector<vector<int>> v;
vector<int> a1 = { 1, 2, 3, 4 };
vector<int> a2 = { 10, 11, 12, 5 };
vector<int> a3 = { 9, 8, 7, 6 };
v.push_back(a1);
v.push_back(a2);
v.push_back(a3);
Fun(v);
system("pause");
return 0;
}