10893 Spiral
时间限制:1000MS 内存限制:65535K
题型: 编程题 语言: 无限制
Description
Given an odd number n, we can arrange integers from 1 to n*n in the shape of a spiral. The figure 2.4.1 below illustrates the spiral made by integers from 1 to 25.
【图片】
21 22 23 24 25 20 7 8 9 10 19 6 1 2 11 18 5 4 3 12 17 16 15 14 13
As we see above, each position in the spiral corresponds to a unique integer. For example, the number in row 1, column 1 is 21, and integer 16 is in row 5, column 2.
Now, given the odd number n (1≤n≤32768), and an integer m (1≤m≤n*n), you should write a program to find out the position of m.
输入格式
The first line of the input is a positive integer T(T≤20). T is the number of the test cases followed. Each case consists of two integer n and m as described above.
输出格式
For each case, output the row number and column number that the given integer is in, separated by a single whitespace. Please note that the row and column number are both starting from 1.
输入样例
3 3 9 5 21 5 16
输出样例
1 3 1 1 5 2
来源
zsu
作者
200831000423
解题思路
上年校赛选拔的时候没做出来却将蛇形矩阵的规律找出来并打印出来,后来无疑肯定是TLE。数据量大就得找规律,解题的办法是找到这个数m在哪个圈子里。通过5*5矩阵可以找出斜线上在不同圈子里数之间的关系,打表存储,在给出数据的时候通过打表的值判断这个数在哪个圈子里然后在这个圈子里找对应的数的位置,具体看实现的代码
1 #include<iostream> 2 #include<cstdio> 3 #include<string> 4 #include<cstring> 5 #include<algorithm> 6 #define MAXN 34000 7 8 using namespace std; 9 10 int list[MAXN/2]; 11 12 void init() 13 {//打表存储斜线上的值 14 for(int i=0; i<MAXN/2; ++i) 15 { 16 if(!i) list[i] = 1; 17 else list[i] = 8*i-2+list[i-1]; 18 } 19 } 20 21 int main() 22 { 23 #ifndef ONLINE_JUDGE 24 freopen("F:\test\input.txt", "r", stdin); 25 #endif // ONLINE_JUDGE 26 init(); 27 int T, row, column; 28 cin>>T; 29 while(T--) 30 { 31 int n, m; 32 cin>>n>>m; 33 int circle = -1, cnt = 0, dis; 34 while(list[++circle] < m); 35 column = row = n/2+1-circle; 36 dis = list[circle] - m; //仍需要移动的步数 37 //找到圈子的情况下进一步处理数据找到最终的位置 38 if(dis <= circle*4) 39 { 40 if(dis <= circle*2) row = row + dis; 41 else 42 { 43 row = row + circle*2; 44 column = column + (dis - circle*2); 45 } 46 } 47 else 48 { 49 int temp = dis - circle*4; 50 if(temp <= circle*2-1) 51 { 52 row = row + circle*2 - temp; 53 column = column + circle*2; 54 } 55 else 56 { 57 temp = temp - (circle*2-1); 58 row = row + 1; 59 column = column + circle*2 - temp; 60 } 61 } 62 cout<<row<<" "<<column<<endl; 63 } 64 65 return 0; 66 }