zoukankan      html  css  js  c++  java
  • [蓝桥杯][基础练习VIP]回形取数

    时间限制: 1Sec 内存限制: 128MB 提交: 128 解决: 34

    题目描述
    回形取数就是沿矩阵的边取数,若当前方向上无数可取或已经取过,则左转90度。一开始位于矩阵左上角,方向向下。
    输入
    输入第一行是两个不超过200的正整数m,  n,表示矩阵的行和列。接下来m行每行n个整数,表示这个矩阵。
    输出
    输出只有一行,共mn个数,为输入矩阵回形取数得到的结果。数之间用一个空格分隔,行末不要有多余的空格。
    样例输入
    3  3 
    
    1  2  3 
    
    4  5  6 
    
    7  8  9 
    样例输出
    1 4 7 8 9 6 3 2 5
    有两种写法,但是第一种不知道为啥出错了,真是让人感到难过,第一个是是利用下标,第二种是使用-1标记访问过的位置。

    #include<stdio.h>
    #include<iostream>
    #include<algorithm>
    using namespace std;
    int m,n,cnt;
    int a[201][201];
    int b[201*201];
    int main(void)
    {
        int i,j;
        scanf("%d%d",&m,&n);
        for(int i=1;i<=m;i++)
            for(int j=1;j<=n;j++)
                cin>>a[i][j];
        int L=1,R=n,X=1,Y=m;
        i=j=1;
        while( i>=X && i<=Y && j>=L && j<=R )
        {
            while(i<=Y)
            {
                b[cnt++]=a[i][j];
                i++;
            }
            i--; L++; j++;
            while(j<=R)
            {
                b[cnt++]=a[i][j];
                j++;
            }
            j--; Y--; i--;
            while(i>=X)
            {
                b[cnt++]=a[i][j];
                i--;
            }
            i++; R--; j--;
            while(j>=L)
            {
                b[cnt++]=a[i][j];
                j--;
            }
            j++; X++; i++;
        }
        for(int i=0;i<cnt;i++)
        {
            printf("%d",b[i]);
            if(i!=cnt-1) printf(" ");
        }
        return 0;
    }
    #include<cstdio>
    using namespace std;
    const int maxn = 210;
    int A[maxn][maxn],B[maxn*maxn];
    
    int main(void)
    {
        int n,m;
        scanf("%d%d",&m,&n);
        for(int i=1;i<=m;i++)
        for(int j=1;j<=n;j++)
        scanf("%d",&A[i][j]);
        int t=0;
        int i=0,j=1;
        while(t<m*n)
        {
            while(i+1<=m && A[i+1][j]!=-1)
            {
                B[++t]=A[i+1][j];
                A[i+1][j]=-1;
                i++;
            }
            while(j+1<=n && A[i][j+1]!=-1)
            {
                B[++t]=A[i][j+1];
                A[i][j+1]=-1;
                j++;
            }
            while(i-1>=1 && A[i-1][j]!=-1)
            {
                B[++t]=A[i-1][j];
                A[i-1][j]=-1;
                i--;
            }
            while(j-1>=1 && A[i][j-1]!=-1)
            {
                B[++t]=A[i][j-1];
                A[i][j-1]=-1;
                j--;
            }
        }
        for(int i=1;i<=t;i++)
        {
            printf("%d",B[i]);
            if(i!=t) printf(" ");
        }
    }
  • 相关阅读:
    C#+Arcengine创建内存图层
    Creating a Feature Set via C#
    ArcGIS Server for JavaScript api安装部署
    Lucene.Net 3.0.3如何从TokenStream中获取token对象
    MMSEG 中文算法说明
    java DotNet char 代码对应
    Lucene.Net 3.0.3如何从TokenStream中获取token对象
    java DotNet char 代码对应
    9.7
    9.6
  • 原文地址:https://www.cnblogs.com/zuimeiyujianni/p/8893749.html
Copyright © 2011-2022 走看看