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