cogs 1811. [NOIP2014]螺旋矩阵

★   输入文件:matrixc.in   输出文件:matrixc.out   简单对比

时间限制:1 s   内存限制:256 MB

【题目描述】

MLE:

#include<iostream>
#include<cstdio>
#include<algorithm>

using namespace std;
const int N=10010;

long long a[N][N];
int n,x,y;

int main()
{
	freopen("matrixc.in","r",stdin);
	freopen("matrixc.out","w",stdout);
	scanf("%d%d%d",&n,&x,&y);
	long long tot=0;
	int i=1,j=0;
	long long nn=n*n;
	while(1)
	{
		while((++j)<=n&&!a[i][j])
			a[i][j]=(++tot);
  		j--;
		while((++i)<=n&&!a[i][j])
			a[i][j]=(++tot);
		i--;
		while((--j)>=1&&!a[i][j])
			a[i][j]=(++tot);
		j++;
		while((--i)>=1&&!a[i][j])
			a[i][j]=(++tot);
	    i++;
		if(tot>=nn)
		{
			printf("%d",a[x][y]);
			return 0;
		}
	}
	return 0;

}

找规律:

#include<stdio.h>
int main()
{	freopen("matrixc.in","r",stdin);
	freopen("matrixc.out","w",stdout);
    int n,i,j;
    int m;//m表示总共的层数
    int k,p,q;//循环变量
    int flag=0;//标志性变量:等于0表示尚未循环到目标元素(i,j)
    int t;
     int len;

    scanf("%d%d%d",&n,&i,&j);
    m=(n+1)/2;  //m表示总共的层数
    t=1;        //t表示要填进数组的数字
    for(k=1;k<=m&&flag==0;k++)
    {
        p=k,q=k;      //(k,k)是第k层左上角坐标点
        len=n-2*(k-1);//表示当前层中每一条边的元素个数
        for(;q<=(k+len-1);q++)//填充当前层的顶边
        {
            if(p==i&&q==j)
            {
                printf("%d\n",t);
                return 0;
            }
            t++;
        }
        q--;
        p++;
        for(;p<=(k+len-1);p++)//填充当前层的右边
        {
            if(p==i&&q==j)
            {
                printf("%d\n",t);
                return 0;
            }
            t++;
        }
        p--;
        q--;
        for(;q>=k;q--)//填充当前层的下边
        {
            if(p==i&&q==j)
            {
                printf("%d\n",t);
                return 0;
            }
            t++;
        }
        q++;
        p--;
        for(;p>k;p--)//填充当前层的左边
        {
            if(p==i&&q==j)
            {
                printf("%d\n",t);
                return 0;
            }
            t++;
        }
    }
    return 0;
}

  

时间: 2024-12-12 16:23:26

cogs 1811. [NOIP2014]螺旋矩阵的相关文章

[NOIP2014普及组]螺旋矩阵

题目地址: ayyzvijos:http://pingce.ayyz.cn/vijos/Problem_Show.asp?id=2017 vijos:https://vijos.org/p/1913 COGS:http://218.28.19.228/cogs/problem/problem.php?pid=1811 题目来源:NOIP2014普及组第三题 问题分析:这道题的内容很易懂,而且容易实现,即直接构造出一个螺旋矩阵,输出对应位置即可.这样的方法大概可以过掉50%的数据.但是,对于100

codevs 3093 螺旋矩阵

题目描述 Description 一个 n 行 n 列的螺旋矩阵可由如下方法生成: 从矩阵的左上角(第 1 行第 1 列)出发,初始时向右移动:如果前方是未曾经过的格子, 则继续前进,否则右转:重复上述操作直至经过矩阵中所有格子.根据经过顺序,在格子中 依次填入 1, 2, 3, ... , n2,便构成了一个螺旋矩阵. 下图是一个 n = 4 时的螺旋矩阵. 1  2  3  4 12  13  14  5 11  16  15  6 10  9  8  7 现给出矩阵大小 n 以及 i 和

2014螺旋矩阵

题目描述 Description 一个 n 行 n 列的螺旋矩阵可由如下方法生成: 从矩阵的左上角(第 1 行第 1 列)出发,初始时向右移动:如果前方是未曾经过的格子, 则继续前进,否则右转:重复上述操作直至经过矩阵中所有格子.根据经过顺序,在格子中 依次填入 1, 2, 3, ... , n2,便构成了一个螺旋矩阵. 下图是一个 n = 4 时的螺旋矩阵. 1  2  3  4 12  13  14  5 11  16  15  6 10  9  8  7 现给出矩阵大小 n 以及 i 和

每日算法之四十一: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 ] ] 针对这个问题采用最直观的方式即可,即螺旋插入,这里有两个地方需要注意,一个是插入边界的界定,

1050. 螺旋矩阵(25)

本题要求将给定的N个正整数按非递增的顺序,填入“螺旋矩阵”.所谓“螺旋矩阵”,是指从左上角第1个格子开始,按顺时针螺旋方向填充.要求矩阵的规模为m行n列,满足条件:m*n等于N:m>=n:且m-n取所有可能值中的最小值. 输入格式: 输入在第1行中给出一个正整数N,第2行给出N个待填充的正整数.所有数字不超过104,相邻数字以空格分隔. 输出格式: 输出螺旋矩阵.每行n个数字,共m行.相邻数字以1个空格分隔,行末不得有多余空格. 输入样例: 12 37 76 20 98 76 42 53 95

leetcode-Spiral Matrix II 螺旋矩阵2之python大法好,四行就搞定,你敢信?

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 ] ] 真的不容易..看博客园有人面试碰到过这个问题,长篇

Java-基础编程(螺旋矩阵&amp;乘法表)

package cn.rick.study; import java.io.BufferedReader;import java.io.InputStreamReader;import java.util.Scanner; /** * * @author Rick-bao date 2014-8-29 * */public class SomeBasicCode { public static void main(String[] args) { MultiplicationTable();//

HLG 1564 螺旋矩阵 (趣味C语言)

链接: http://acm.hrbust.edu.cn/index.php?m=ProblemSet&a=showProblem&problem_id=1564 Description 对于给定的一个数n,要你打印n*n的螺旋矩阵. 比如n=3时,输出: 1 2 3 8 9 4 7 6 5 Input 多组测试数据,每个测试数据包含一个整数n(1<=n<=32) Output 对于每组测试数据,输出一个n*n的螺旋矩阵,定义在题目描述里. 在一组测试数据中,每个数占的字符宽度

从外向内扩的螺旋矩阵

形如: 1   2   3   4  5 16 17 18 19  6 15 24 25 20  7 14 23 22 21  8 13 12 11 10  9 如果我们需要打印这样从外部向内扩展的n * n矩阵. 分析: 可以把矩阵分为n/2个圈, (上面的例子分了两个圈,最外面的圈就是12345~16,另外一个圈就是17~24) 我们只需要以圈为单位,给二维数组中的每个数赋值.赋值的顺序也是按照数字的递增顺序(顺时针) Java代码如下: public class SpiralMatrix