洛谷——P2239 螺旋矩阵

本文介绍了一个n行n列螺旋矩阵的生成方法,并提供了两种不同的算法实现方案来解决给定矩阵大小n及坐标(i,j)时,求对应位置上的数值的问题。通过打表找规律与模拟的方法,实现了矩阵的生成过程。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

P2239 螺旋矩阵

题目描述

一个n行n列的螺旋矩阵可由如下方法生成:

从矩阵的左上角(第1行第1列)出发,初始时向右移动;如果前方是未曾经过的格子,则继续前进,否则右转;重复上述操作直至经过矩阵中所有格子。根据经过顺序,在格子中依次填入1, 2, 3, ... , n,便构成了一个螺旋矩阵。2

下图是一个n = 4 时的螺旋矩阵。

1 2 3 4

12 13 14 5

11 16 15 6

10 9 8 7

现给出矩阵大小n以及i和j,请你求出该矩阵中第i行第j列的数是多少。

(本题目为2014NOIP普及T3)

输入输出格式

输入格式:

 

输入共一行,包含三个整数 n,i,j,每两个整数之间用一个空格隔开,分别表示矩阵大小、待求的数所在的行号和列号。

 

输出格式:

 

输出共一行,包含一个整数,表示相应矩阵中第i行第j列的数。

 

输入输出样例

输入样例#1: 复制
4 2 3
输出样例#1: 复制
14

说明

【数据说明】

对于50%的数据,1 ≤ n ≤ 100;

对于100%的数据,1 ≤ n ≤ 30,000,1 ≤ i ≤ n,1 ≤ j ≤ n。

 

打表找规律+模拟

#include<iostream>
#include<cstdio>
#include<cstdlib>
#include<iomanip>
using namespace std;
int a[100][100];
int main()
{
    freopen("a.out","w",stdout);
    int n,x,y,tot;
    cin>>n;
    tot=a[x=0][y=0]=1;
    while(tot<n*n)
    {
        while(y+1<n&&!a[x][y+1])    a[x][++y]=++tot;
        while(x+1<n&&!a[x+1][y])    a[++x][y]=++tot;
        while(y-1>=0&&!a[x][y-1])    a[x][--y]=++tot;
        while(x-1>=0&&!a[x-1][y])    a[--x][y]=++tot;
    }
    for(int i=0;i<n;i++){
        for(int j=0;j<n;j++)
            cout<<setw(3)<<a[i][j]<<" ";
        cout<<endl;
    }
return 0;    
}
表、、
#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
using namespace std;
int n,m,x,y,s,nx,ny,ans;
int read()
{
    int x=0,f=1; char ch=getchar();
    while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();}
    while(ch>='0'&&ch<='9') x=x*10+ch-'0',ch=getchar();
    return x*f;
}
int main()
{
    n=read(),x=read(),y=read();
    nx=min(x,n+1-x),ny=min(y,n+1-y);
    s=min(nx,ny),m=n;if(s==0) s=1;
    for(int i=1;i<s;i++)
    {
        ans+=m*2+(m-2)*2;
        m-=2;
    } 
    if(s==nx)
    {
        if(s==x) ans+=y-s+1;
        else ans+=2*m+n-y-s;
    }
    else
    {
        if(s==y) ans+=3*m-1+n-x-s;
        else ans+=m+x-s;
    }
    printf("%d",ans);
    return  0;
}

 

转载于:https://www.cnblogs.com/z360/p/7900212.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值