螺旋矩阵

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;
}

 

posted @ 2018-07-16 01:15  皮皮嘉  阅读(712)  评论(0编辑  收藏  举报