One day, an ant called Alice came to an M*M chessboard. She wanted to go around all the grids. So
she began to walk along the chessboard according to this way: (you can assume that her speed is one
grid per second)
At the rst second, Alice was standing at (1,1). Firstly she went up for a grid, then a grid to the
right, a grid downward. After that, she went a grid to the right, then two grids upward, and then two
grids to the leftin a word, the path was like a snake.
For example, her rst 25 seconds went like this:
( the numbers in the grids stands for the time when she went into the grids)
25
24
23
22
21
5
10
11
12
13
20
4
9
8
7
14
19
3
2
3
6
15
18
2
1
4
5
16
17
1
1
2
3
4
5
At the 8-th second , she was at (2,3), and at 20-th second, she was at (5,4).
Your task is to decide where she was at a given time (you can assume that
M
is large enough).
Input
Input le will contain several lines, and each line contains a number
N
(1
N
2
10
9
), which stands
for the time. The le will be ended with a line that contains a number `
0
'.
Output
For each input situation you should print a line with two numbers (
x
,
y
), the column and the row
number, there must be only a space between them.
SampleInput
8
20
25
0
SampleOutput
2 3
5 4
1 5
这题太大 不能写一个数组出来
首先想到要找规律
先去看平方数
去看了题解
要从对角线开始看
1 3 7 13 每两个数差2, 4, 6 数列首项1
num+= 2×(i - 1 )
输入的数要和num比较大小 比num大的又要《=num + i -1
比num小的又要 = num - i + 1
在判断i的奇偶来决定x变还是y变
不知道为什么1 2 有问题 ,偷懒把它们提出来
#include <stdio.h>
int main(){
int n, num = 1, x, y;
while (scanf("%d", &n) != EOF) {
if (n == 0)
break;
num = 1;
if (n == 1) {
x = 1;
y = 1;
}
else if (n == 2) {
x = 1;
y = 2;
}
else
for (int i = 1; i < n; i++) {
num += 2 * (i - 1);
if (num == n) {
x = i;
y = i;
break;
}
if (n > num && n <= num + i - 1) {
if (i % 2 == 0) {
x = i;
y = i - n + num;
}
else {
y = i;
x = i - n + num;
}
break;
}
else if (n < num && n >= num - i + 1) {
if (i % 2 == 0) {
y = i;
x = i - num + n;
}
else {
x = i;
y = i - num + n;
}
break;
}
}
printf("%d %d\n", x, y);
}
return 0;
}