螺旋数组
题目:输入一个矩阵,按照从外向里以顺时针的顺序依次打印出每一个数字。
例如:如果输入如下矩阵:
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; }