谈谈机试吧,虽然一举通过某知名学府的机试获得预录取,但是之后找实习过程中的机试通过率只有10%,十分惭愧。所以特地开了编程版,之后继续有彩蛋(⊙o⊙)哦~
链接里面有很多种方法,在这里,我只提出一种方法,只要稍加改动,就可以解决螺旋矩阵和回字矩阵了,具有一定的通用性吧。
1.螺旋矩阵
Tips:考虑到这是机试,时间有限,并不排除思维比较活跃的童鞋能够马上找到坐标与数值的关系,但是“模拟法”是最快最直接的。
相关链接:http://blog.csdn.net/sunmenggmail/article/details/7779651
1.1单螺旋矩阵
1.1.1从中间往外顺时针旋转,如下所示:
Tips:一圈一圈地由内向外拓展
#include <iostream>
using namespace std;
int main()
{
int r, c;
cin >> r >> c;
int **a = new int*[r];
for (int k = 0; k < r; k ++)
a[k] = new int[c];
int col = (c + 1)/2, row = (r + 1)/2; //3,3
int end = (c - 1) / 2; //2
int num = 1;
a[col-1][row-1] = num ++;
int idx, i, j;
for (idx = end; idx > 0; idx --){
for (i = idx; i <= row; i ++) //2,3
a[i][col] = num ++;
for (j = col -1; j >= idx - 1; j --)//2,1
a[row][j] = num ++;
for (i = row - 1; i >= idx - 1; i --)//2,1
a[i][idx - 1] = num ++;
for (j = idx; j <= col; j ++)//2,3
a[idx - 1][j] = num ++;
col ++;
row ++;
}
for (i = 0; i < r; i ++){
for (j = 0; j < c; j ++)
cout << a[i][j] << ' ';
cout << endl;
}
for(i = 0; i < r; i++){
delete []a[i];
a[i] = NULL;
}
delete []a;
a = NULL;
return 0;
}
1.1.2从外向内螺旋矩阵:
1 按顺时针方向构建一个m * n的螺旋矩阵