• 螺旋矩阵


    1495: 螺旋矩阵

    时间限制: 1 Sec  内存限制: 128 MB
    提交: 6  解决: 3
    [提交][状态][讨论版][命题人:外部导入]

    题目描述

    给定一个正整数N,生成一个N*N的矩阵,矩阵中元素取值为1~N^2,1在左上角,其余各数按顺时针方向旋转前进,依次递增放置。例如,当N=4时,矩阵各元素如下:

    1 2 3 4
    12 13 14 5
    11 16 15 6
    10 9 8 7

    在本题中,给定N,及矩阵中的某个位置(用行和列坐标表示,均从1开始记起),要求输出该位置上的元素。

    输入

    输入文件中包含多个测试数据。每个测试数据占一行,为3个正整数N i j,1≤N≤100,1≤i,j≤N。输入文件最后一行为3个0,表示输入结束。

    输出

    对输入文件中的每个测试数据,输出对应的元素。

    样例输入

    4 3 3
    100 100 100
    0 0 0
    

    样例输出

    15
    199


    解题思路:对于这个矩阵,如果直接找i,j的数字是多少,会超时,但是如果它是在最外层的话,寻找的时间就会少很多,所以当这个i行j列不是最外层的时候,可把这个n阶矩阵转换成一个n-2阶的矩阵,此时i行j列就变成了此时的i-1行j-1列,第一行第一列的元素就变成了原本的a[1][1]+4*n-4,最终变成最外层后再遍历一下就好了。值得注意的是,当n为奇数时,且寻找的点在中心的时候,转换后的矩阵是一个1*1的矩阵,这时直接输出cnt就行。
    #include <iostream>
    #include <cstring>
    #include <algorithm>
    using namespace std;
    
    int main()
    {
        int n,row,col;
        while(cin>>n>>row>>col&&n)
        {
            int cnt=1;
            while(row!=n&&col!=n&&row>1&&col>1)
            {
                row--;col--;
                cnt+=(4*(n-1));
                n-=2;
            }
            int x=1,y=1;
            bool flag=true;
            while(flag&&x+1<=n){if(x==col&&y==row){cout<<cnt<<endl;flag=false;}else{x++;cnt++;}}
            while(flag&&y+1<=n){if(x==col&&y==row){cout<<cnt<<endl;flag=false;}else{y++;cnt++;}}
            while(flag&&x-1>=1){if(x==col&&y==row){cout<<cnt<<endl;flag=false;}else{x--;cnt++;}}
            while(flag&&y-1>=1){if(x==col&&y==row){cout<<cnt<<endl;flag=false;}else{y--;cnt++;}}
            if(n==1)cout<<cnt<<endl;
        }
        return 0;
    }
  • 相关阅读:
    uniapp数据循环带参数拼接方法
    UniApp页面跳转
    layui表单提交时关闭默认刷新页面
    js计时器
    Jquery 鼠标移入移出事件
    jquery常用ajax请求
    易宝网上支付接口的实现
    不使用缓存和不同缓存下程序的效率测试
    Mysql常见指令--常用的命令
    PHP冒泡与快速排序法
  • 原文地址:https://www.cnblogs.com/wjw2018/p/9315767.html
Copyright © 2020-2023  润新知