UVA 10161 Ant on a Chessboard

yiyi : 先看对角线

你会发现对角线中的值和它的行数之间是有关系的,还有就是后面的数是围着1一圈一圈往外扩的。

我们输入N以后,再根据N的值的大小,从对角线上的数开始找,找的过程要跟据行的奇偶,需要分成不同的情况!

题目:

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 109), 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.
Sample Input
8
20
25
0
Sample Output
2 3
5 4
1 5

答案:

#include <stdio.h>
#include <iostream>

using namespace std;
int main () {
	int n, x, y, i, m;
	
	while (scanf("%d", &n) != EOF && n) {
	m = 1;
	i = 1;
	do {
		m = m + 2 * (i - 1);
		if (m == n) {
			x = i;
			y = i;
			break;
		}
		else if (n < m && n >= (m - i + 1)) {
			if (i % 2 == 0) {
				x = i - (m - n);
				y = i;
			}
			else {
				x = i;
				y = i - (m - n);
			}
			break;
		}
		else if (n > m && n <= (m + i - 1)) {
			if (i % 2 == 0) {
				x = i;
				y = i - (n - m);
			}
			else {
				x = i - (n - m);
				y = i ;
			}
			break;
		}
		i++;
	}
	while (1);
	printf("%d %d\n", x, y);
	}
	return 0;
}



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值