索引请参考:系列目录
题目:
- 定义N维蛇形方阵的生成方式如下:把1~N^2依次填入矩阵中,并且填入的时候,会从矩阵最外圈填,当最外圈填完后,会继续填写此外圈,一开始填写外圈的时候,会按照顺时针填入数字,到此外圈的时候,会用逆时针填入,在一圈则又会采用顺时针填写的方式,以这种顺时针、逆时针交错的填写的方式,直到所有数字填写完毕。
- 示例:
- 假设N= 7,7维方阵为:
- 给定N,给出带哦个需要查询的坐标(x,y),请输出N维蛇形方阵中(x,y)的值是多少。
- 假设左上角为(0,0),x代表行号,从上到下依次为0~N-1。y代表列号,从左到右依次为0 ~ N-1
#include<iostream>
#include<vector>
void print(std::vector<std::vector<int>> & arr);
void PrintNumber(std::vector<std::vector<int>> & arr);
void inputClockwiseNumber(std::vector<std::vector<int>> & arr, const int start, const int N);
void inputCounterclockwiseNumber(std::vector<std::vector<int>> & arr, const int start, const int end);
static int num = 1;
int main()
{
std::cout << "请输入方阵维度:";
int N;
std::cin >> N;
std::cin.get();
std::cout << "几个查询:";
int num;
std::cin >> num;
std::cin.get();
std::vector<std::vector<int>> arr2(N, std::vector<int>(N));
PrintNumber(arr2);
print(arr2);
std::vector<std::pair<int, int>>coor;
for (int i = 0; i < num; i++)
{
std::cout << "x:";
int x;
std::cin >> x;
std::cin.get();
std::cout << "y:";
int y;
std::cin >> y;
std::cin.get();
coor.push_back({ x,y });
}
for (int i = 0; i < num; i++)
{
std::cout << arr2[coor[i].first][coor[i].second] << std::endl;
}
return 0;
}
void print(std::vector<std::vector<int>> & arr) {
int heigh = arr.size();
int width = arr[0].size();
for (int i = 0; i < heigh; i++)
{
for (int j = 0; j < width; j++)
std::cout << arr[i][j] << "\t";
std::cout << std::endl;
}
std::cout << std::endl;
}
void PrintNumber(std::vector<std::vector<int>> & arr) {
int start = 0;
int end = arr.size() - 1;
int colRow = arr.size();
while (colRow > start * 2)
{
//顺时针填写
if (start % 2 == 0)
inputClockwiseNumber(arr, start++, end--);
//逆时针填写
else
inputCounterclockwiseNumber(arr,start++, end--);
}
}
//顺时针
void inputClockwiseNumber(std::vector<std::vector<int>> & arr,const int start, const int end) {
//从左到右
for (int i = start; i <= end; i++)
arr[start][i] = num++;
//从上到下
if (start < end)
{
for (int i = start + 1; i <= end; i++)
arr[i][end] = num++;
}
//从右到左
if (start < end)
{
for (int i = end - 1; i >= start; i--)
arr[end][i] = num++;
}
//从下到上
if (start < end - 1)
{
for (int i = end - 1; i > start; i--)
arr[i][start] = num++;
}
}
//逆时针
void inputCounterclockwiseNumber(std::vector<std::vector<int>> & arr, const int start, const int end) {
//从上到下
for (int i = start; i <= end; i++)
arr[i][start] = num++;
//从左到右
if (start < end)
{
for (int i = start + 1; i <= end; i++)
arr[end][i] = num++;
}
//从下到上
if (start < end - 1)
{
for (int i = end - 1; i >= start; i--)
arr[i][end] = num++;
}
//从右到左
if (start < end )
{
for (int i = end - 1; i > start; i--)
arr[start][i] = num++;
}
}
运行结果:
评注:该题目是在面试过程中看似很复杂,但实际其算法本身并不复杂,但是需要考虑各种情况。算法具体思路请参考上一篇:剑指offer面试题29:顺时针打印矩阵
在实际参加考试的时候,我们所写的算法需要我们在ACM模式下进行,即需要把程序的主函数等全都写出来并测试。