螺旋队列问题2
2013-06-27 15:23
246 查看
题:如矩阵
1 2 3 4 5
16 17 18 19 6
15 24 25 20 7
14 23 22 21 8
13 12 11 10 9
找出规律,并打印出一个NxN的矩阵,规律就是从首坐标开始顺时针一次增大。
解析:
依次:按左-->右,上-->下,右-->左,下-->上的方向交替访问,如果遇到已经访问过的元素,不做任何修改。代码如下:
1 2 3 4 5
16 17 18 19 6
15 24 25 20 7
14 23 22 21 8
13 12 11 10 9
找出规律,并打印出一个NxN的矩阵,规律就是从首坐标开始顺时针一次增大。
解析:
依次:按左-->右,上-->下,右-->左,下-->上的方向交替访问,如果遇到已经访问过的元素,不做任何修改。代码如下:
// P91_Example.cpp : Defines the entry point for the console application. // #include "stdafx.h" #include <iostream> #define MAX 5 int a[MAX][MAX]; //保存5x5的矩阵 void foo(int n) { int m = 1; for(int i = 0; i < MAX/2; i++) //MAX/2表示有多少圈 { for(int j = 0; j < MAX-i; j++) //上 { if(0 == a[i][j]) a[i][j] = m++; } for(int j = i+1; j < MAX-i; j++) //右 { if(0 == a[j][n-i-1]) a[j][n-i-1] = m++; } for(int j = MAX-i-1; j > i; j--) //下 { if(0 == a[n-i-1][j]) a[n-i-1][j] = m++; } for(int j = MAX-i-1; j > i; j--) //左 { if(0 == a[j][i]) a[j][i] = m++; } } if(1== MAX%2) a[MAX/2][MAX/2] = m; } int _tmain(int argc, _TCHAR* argv[]) { for(int i = 0; i < MAX; ++i) { for(int j = 0; j < MAX; ++j) { a[i][j] = 0; } } foo(MAX); for(int i = 0; i < MAX; ++i) { for(int j = 0; j < MAX; ++j) { std::cout<<"a["<<i<<"]["<<j<<"] = "<<a[i][j]<<"\t"; } std::cout<<std::endl; } return 0; }