题目:输入一个矩阵,按照从外向里以顺时针的顺序依次打印出每一个数字。
例如:如果输入如下矩阵:
1 2 3 4
5 6 7 8
9 10 11 12
13 14 15 16
则依次打印出数字1, 2, 3, 4, 8, 12, 16, 15, 14, 13, 9, 5, 6,7, 11, 10。
总结规律,找出通项公式这个太复杂了,还是老老实实输出
方法:
依次:按左-->右,上-->下,右-->左,下-->上的方向交替访问,如果遇到已经访问过的元素,那么就改变访问的方向。
#include<iostream>
using namespace std;
int main()
{
const int ROW = 4;
const int COL = 4;
int a[ROW][COL]={{1,2,3,4},{5,6,7,8},{9,10,11,12},{13,14,15,16}};
int b[ROW][COL]={0};//记录此元素有没有被访问过,访问过就置1
int count =0;
int direct = 1;
int row = 0;
int col = -1;
while(count<COL*ROW)
{
// left to right
col++;
while(col<COL && b[row][col]==0)//如果没有访问过,就访问,并且置访问位 = 1
{
cout<<a[row][col]<<"\t";//
b[row][col] = 1;
col++;
count++;
}
col--;//因为上面循环退出的话,说明要么col越界,要么访问了已经访问过的元素,所以col应该往回退1
//top to down
row++;
while(row<ROW && b[row][col]==0)
{
cout<<a[row][col]<<"\t";
b[row][col] = 1;
row++;
count++;
}
row--;
//right to left
col--;
while(col>=0 && b[row][col]==0)
{
cout<<a[row][col]<<"\t";
b[row][col] = 1;
col--;
count++;
}
col++;
//down to top
row--;
while(row>=0 && b[row][col]==0)
{
cout<<a[row][col]<<"\t";
b[row][col] = 1;
row--;
count++;
}
row++;
}
getchar();
return 0;
}