【算法】【模拟法】--- 螺旋矩阵填数

【题目描述】

在一个n * n的矩阵中按照螺旋样式填入从1一直到n * n的一串整数,下面是当n = 4时的矩阵:

1 2 3 4

12 13 14 5

11 16 15 6

10 9 8 7

现在给出矩阵的边长n,直接输出该矩阵。

【输入】

一个整数,即矩阵的边长n。(n <= 100)

【输出】

该矩阵的所有元素。

我的分析:

使用模拟法。

设置一个结构体move,分别包含当前的坐标(x,y)、当前的元素编号(score)以及当前的层数(c);再设计一个结构体first,表示每一层首元素的坐标(x,y),只需得出首元素的坐标,就能得出此层的边长(first.x(或first.y) + n - 2 * (move.c - 1) - 1)。

然后,我们可以根据边长来判断move的坐标是否到达边界,如果到达,则进行转弯,元素编号加1;反之就给相对应的坐标加上1或减1,同时元素编号加1。

当我们到达左端的边的最后一个元素时,层数+1,first的横纵坐标分别+1并赋给move的横纵坐标,表示下一层的开始。

不断反复上述过程,直到元素的编号等于n * n时退出整个循环(如果n为奇数时,别忘了退出循环后,给矩阵最中间的元素赋值)然后直接输出即可。

我的C++源代码:

#include <iostream>
using namespace std;

struct pos1
{
    int x, y, score, c;
};

struct pos2
{
    int x, y;
};

int matrix[101][101] = {0};
pos1 move = {1, 1, 1, 1};
pos2 first = {1, 1};

int main(void)
{
    int n;
    cin >> n;
    while(move.score < n * n)
    {
        while((move.y >= first.y)&&(move.y < first.y + n - 2 * (move.c - 1) - 1)) 
            matrix[move.x][move.y++] = move.score++;
        while((move.x >= first.x)&&(move.x < first.x + n - 2 * (move.c - 1) - 1)) 
            matrix[move.x++][move.y] = move.score++;
        while((move.y <= first.y + n - 2 * (move.c - 1) - 1)&&(move.y > first.y))
            matrix[move.x][move.y--] = move.score++;
        while((move.x <= first.x + n - 2 * (move.c - 1) - 1)&&(move.x > first.x))
            matrix[move.x--][move.y] = move.score++;
        move.c++;
        first.x++;
        first.y++;
        move.x = first.x;
        move.y = first.y;
    }
    if (n % 2 == 1) matrix[n / 2 + 1][n / 2 + 1] = n * n;
    for(int i = 1; i <= n; i++)
    {
        for(int j = 1; j <= n; j++) cout << matrix[i][j] << ‘ ‘;
        cout << endl;
    }
    return 0;
}
时间: 2024-12-18 16:59:22

【算法】【模拟法】--- 螺旋矩阵填数的相关文章

bzoj5010: [Fjoi2017]矩阵填数

Description 给定一个 h*w 的矩阵,矩阵的行编号从上到下依次为 1..h,列编号从左到右依次1..w.在这个矩阵中你需要在每 个格子中填入 1..m 中的某个数.给这个矩阵填数的时候有一些限制,给定 n 个该矩阵的子矩阵,以及该子矩阵的 最大值 v,要求你所填的方案满足该子矩阵的最大值为 v.现在,你的任务是求出有多少种填数的方案满足 n 个限 制.两种方案是不一样的当且仅当两个方案至少存在一个格子上有不同的数.由于答案可能很大,你只需要输出答 案 对 1,000,000,007

[BZOJ5010][FJOI2017]矩阵填数(状压DP)

5010: [Fjoi2017]矩阵填数 Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 90  Solved: 45[Submit][Status][Discuss] Description 给定一个 h*w 的矩阵,矩阵的行编号从上到下依次为 1..h,列编号从左到右依次1..w.在这个矩阵中你需要在每 个格子中填入 1..m 中的某个数.给这个矩阵填数的时候有一些限制,给定 n 个该矩阵的子矩阵,以及该子矩阵的 最大值 v,要求你所填的方案满

[算法竞赛入门]蛇形填数

蛇形填数.在n×n方阵里填入1,2,-,n×n,要求填成蛇形.例如,n=4时方阵为:10 11 12 19 16 13 28 15 14 37 6 5 4上面的方阵中,多余的空格只是为了便于观察规律,不必严格输出.n≤8. [解析]这道题的解题思路主要还是在于如何模拟蛇形填数的过程. 我们给出两个概念的定义: (1)方向:该题中的方向顺序为"下-左-上-右" (2)墙:填数过程中若遇到墙,则应改变方向. [一种实现思路]注:这里我将n*n矩阵广义为n*m矩阵,令m=n. #includ

FJOI2017 矩阵填数

题目 给定一个 \(h\times w\) 的矩阵,每个格子中将填入 \(1\) 到 \(m\) 中的某个整数. 一个合法的填数方案须满足 \(n\) 条限制,每条限制形如"以 \((x_1,y_1)\) 为左上角,\((x_2,y_2)\) 为右下角的子矩阵中,最大值必须为 \(v\)". 求填数方案数,对大质数取模. 把这 \(n\) 条限制按照 \(v\) 从小到大排序. 这样,就可以对每个 \(x\) 求出最小限制为 \(x\) 的区域的答案,最后处理没被限制的区域(这显然是

【算法】矩阵填数,深度优先搜索(DFS),Pascal改C语言

面向对象的上机实验 题目 以下列方式向 5*5 矩阵中填入数字.设数字i(1=<i<=25),则数字i+1 的坐标位置应为(E, W).(E, W)可根据下列关系由(x,y)算出: 1)(E, W)=(x±3,y) 2)(E, W)=(x,y±3) 3)(E, W)=(x±2,y±2) 求解问题如下: 编写一个程序,当数字1被指定于某个起始位置时,列举出其它24个数字应在的位置:列举该条件下的所有可能方案. 参考答案 网上搜索到数学奥赛中本题的Pascal代码 来自http://blog.si

HihoCoder 1480:矩阵填数 (杨氏矩阵 || 钩子公式 + 筛逆元)

描述 小Hi在玩一个游戏,他需要把1, 2, 3, ... NM填入一个N行M列的矩阵中,使得矩阵每一行从左到右.每一列从上到下都是递增的. 例如如下是3x3的一种填法: 136 247 589 给定N和M,小Hi希望知道一共有多少种不同的填法. 输入 一行包含两个整数N和M. 对于60%的数据 1 <= N <= 2, 1 <= M <= 100000 对于20%的数据 N = 3, 1 <= M <= 100 对于100%的数据 1 <= N <= 3,

P3813 [FJOI2017]矩阵填数

传送门 矩阵很大,但是发现 $n$ 很小,从这边考虑,对于一个一堆小矩阵放在一起的情况 考虑把每一块单独考虑然后方案再乘起来 但是这些奇怪的东西很不好考虑 所以暴力一点,直接拆成一个个小块 但是这样我们还要考虑到小矩形的限制,设 $f[i][S]$ 表示现在考虑完第 $i$ 个小块,小矩形的限制满足的状态为 $S$ 时的方案数 发现这些小块不会跨过矩形,维护每个小块的限制(即这个块能填的最大的数)$Mx$,以及这个小块填最大数时,能使哪些小矩形满足限制 ($P$) 设小块的面积为 $S$,那么如

蛇形矩阵填数

我们根据4*4矩阵找一下规律: 10 11 12 1 9 16 13 2 8 15 14 3 7 6 5 4观察可知 以右上角的一开始,可将 #include<cstdio>using namespace std;int main(){ int n,p,q,x=1; scanf("%d",&n); p=1; q=n; int a[n+2][n+2]; for(int m=n-1;m>0;m-=2){ for(int k=1;k<=4;k++){ if(k

每日算法之四十一:Spiral Matrix II (螺旋矩阵)

Given an integer n, generate a square matrix filled with elements from 1 to n2 in spiral order. For example, Given n = 3, You should return the following matrix: [ [ 1, 2, 3 ], [ 8, 9, 4 ], [ 7, 6, 5 ] ] 针对这个问题采用最直观的方式即可,即螺旋插入,这里有两个地方需要注意,一个是插入边界的界定,