首页 > 试题广场 >

蛇形矩阵

[编程题]蛇形矩阵
  • 热度指数:225 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 32M,其他语言64M
  • 算法知识视频讲解
蛇形矩阵,作为一种常用的数字数列,是由1开始的自然数一次排列成的一个N*N的正方形矩阵,数字依次由外而内的递增,如下面实例:
n=3的蛇形矩阵
1 2 3
8 9 4
7 6 5
n=6的蛇行矩阵
1 2 3 4 5 6
20 21 22 23 24 7
19 32 33 34 25 8
18 31 36 35 26 9
17 30 29 28 27 10
16 15 14 13 12 11
此题要求输入蛇形矩阵宽度N,输出整个蛇形矩阵结果,注意输出格式要求按照矩阵从上至下的依次按行输出,每行中间无需换行输出。

输入描述:
输入为一个数字N,即蛇形矩阵的宽度(1 ≤ N ≤ 20)。


输出描述:
输出一行N阶蛇形矩阵的值,以空格分割。行末无空格。
示例1

输入

3

输出

1 2 3 8 9 4 7 6 5
#include <iostream>
#include <vector>

using namespace std;

int main()
{
    // const int N = 6;

    int N = 0;
    while (cin >> N)
    {
        vector<vector<int> > dp(N, vector<int>(N));

        int pos = 1;
        int deal_num = 0;
        while (true)
        {
            if (pos > N * N) {
                break;
            }

            // 4个边
            for (int i = 0; i < 4; ++i)
            {
                if (pos > N * N) {
                    break;
                }

                // 只剩一个数了
                if (N - 1 - deal_num * 2 == 0) {
                    dp[deal_num][0 + deal_num] = pos++;
                    break;
                }

                // 每边 N - 1 - deal_num * 2 个数
                for (int j = 0; j < N - 1 - deal_num * 2; ++j) {
                    if (pos > N * N) {
                        break;
                    }

                    switch (i)
                    {
                    case 0:
                    {
                        dp[deal_num][j + deal_num] = pos++;
                        break;
                    }
                    case 1:
                    {
                        dp[j + deal_num][N - 1 - deal_num] = pos++;
                        break;
                    }
                    case 2:
                    {
                        dp[N - 1 - deal_num][N - 1 - j - deal_num] = pos++;
                        break;
                    }
                    case 3:
                    {
                        dp[N - 1 - j - deal_num][deal_num] = pos++;
                        break;
                    }
                    }
                }
            }

            ++deal_num;
        }

        for (const auto& item : dp) {
            for (const auto& v : item) {
                cout << v << " ";
            }
        }
    }
    return 0;
}
发表于 2021-11-13 20:25:28 回复(0)
分成两部分理解
1. 第一圈的形成
2. 后面每圈都像第一圈一样,一共有n/2圈,奇数的最后在中心填上n*n

#include<iostream>
using namespace std;

int main(){
	
	int n;
    while(cin >> n){
        

    int cnt = 0;
	int num[n][n];
	for(int i = 0; i < n/2; ++i){   // 每一圈
		for(int j = i; j < n-i; ++j){  // 第一行从左向右
			++cnt;
			num[i][j] = cnt;
		}
		for(int j = i+1; j < n-i-1; ++j){ // 右边一列 从上i+1到下 n-i-2
			++cnt;
			num[j][n-i-1] = cnt;
		}
		for(int j = n-i-1; j >= i; --j){ // 最后一行从右向左
			++cnt;
			num[n-i-1][j] = cnt;
		}
		for(int j = n-i-2; j > i; --j){  // 左边一列 从下 n-i-2到上i+1
			++cnt;
			num[j][i] = cnt;
		}
		
	}
	if(n % 2 == 1) num[n/2][n/2] = n*n;
	for(int i = 0; i < n; ++i){
		for(int j = 0; j < n; ++j){
			cout << num[i][j];  
            if(i != n-1 || j != n-1) cout << " "; // 一列输出
		}
	}
    }
	return 0;
}



发表于 2020-03-30 16:44:09 回复(0)
随便写点
#include<iostream>
#include<vector>
using namespace std;
int main()
{
    int N;
    while(cin>>N){//输入n
        vector<vector<int>> arr(N,vector<int>(N,0));//初始化vector
        int circle=N%2? N/2+1:N/2;//圈数
        int n=1;
        for(int x=0;x<circle;x++){
            for(int y=x;y<N-x;y++) arr[x][y]=n++;//n=4 end//列变化
            for(int y=x+1;y<N-x;y++) arr[y][N-x-1]=n++;//行变化
            for(int y=N-x-2;y>=x;y--) arr[N-x-1][y]=n++;//列变化
            for(int y=N-x-2;y>=x+1;y--) arr[y][x]=n++;//行变化
        }
        for(int i=0;i<N;i++){
            for(int j=0;j<N;j++)
                if(i==N-1&&j==N-1) cout<<arr[i][j];
                else cout<<arr[i][j]<<" ";
        }
    }
    return 0;
}
发表于 2017-12-13 21:11:35 回复(0)
#include <iostream>
#include <string>
#include <vector>
#include <algorithm>

int main() {
    using namespace std;
    int n;
    while (cin >> n) {
        vector<vector<int> > arr(n, vector<int>(n, 0));
        int l = 0, r = 0;
        int cnt = 1;
        while (n > 0) {
            int i = l, j = r;
            while (j < r + n) {
                if (!arr[i][j]) {
                    arr[i][j] = cnt;
                    cnt++;
                }
                j++;
            }
            j--;
            while (i < l + n) {
                if (!arr[i][j]) {
                    arr[i][j] = cnt;
                    cnt++;
                }
                i++;
            }
            i--;
            while (j >= r) {
                if (!arr[i][j]) {
                    arr[i][j] = cnt;
                    cnt++;
                }
                j--;
            }
            j++;
            while (i >= l) {
                if (!arr[i][j]) {
                    arr[i][j] = cnt;
                    cnt++;
                }
                i--;
            }
            i++;
            l++;
            r++;
            n -= 2;
        }
        for (int i = 0; i < arr.size(); i++) {
            for (int j = 0; j < arr[0].size(); j++) {
                if (i == arr.size() - 1 && j == arr[0].size() - 1) {
                    cout << arr[i][j];
                    continue;
                }
                cout << arr[i][j] << " ";
            }
        }
        cout << endl;
    }
    return 0;
}
啥也不说了,代码写的就是乱。。。。
发表于 2017-07-05 11:13:44 回复(0)

问题信息

难度:
4条回答 4128浏览

热门推荐

通过挑战的用户

蛇形矩阵