uva 10161 Ant on a Chessboard 蛇形矩阵 简单数学题

来源:互联网 发布:淘宝哪种推广方法最好 编辑:程序博客网 时间:2024/06/05 15:52

题目给出如下表的一个矩阵: (红字表示行数或列数)

252423222151011121320498714193236151821451617112345

如表格,矩阵是从1开始盘曲的,排放规律不是很难找。

题目要求算出某个数的坐标,数据范围2*10^9,很明显不能用模拟的,这题是纯数学题,找规律题。

我们把矩阵拆开来看,每次进入上一层都会方向反转,每一层拆出来看就是:

25242322 21 2019 18 171011 12 13 14 151698 7 6 52 3 4 1


这样一个三角形,把坐标也写进去就是:

(第一次发现编辑器如此蛋疼。。。制表格老是错乱!)

下面贴了图片了。

2524 23 22 21 2019 18 17 第5层1.52.5 3.54.5 5.55.4 5.35.2 5.11011 12 13 14 1516 第4层1.42.4 3.44.4 4.34.2 4.198 7 6 5 第3层1.32.3 3.33.2 3.123 4第2层1.22.2 2.1 1第1层1.1



很快就能发现中间那个数都是在(n,n),然后向左向右都有规律的变化。

只要把这个规律描述出来就行了,注意层数的奇偶不同变化规律也会有所不同。

具体见代码:

#include <cstdio>#include <cmath>using namespace std;int main() {long long n;while (scanf("%lld", &n) && n) {long long k = ceil(sqrt(n));if (k % 2 == 0) {if (k * k - n + 1 < n - (k - 1) * (k - 1))printf("%lld %lld\n", k, k * k - n + 1);elseprintf("%lld %lld\n", n - (k - 1) * (k - 1), k);}else {if (k * k - n + 1 < n - (k - 1) * (k - 1))printf("%lld %lld\n", k * k - n + 1, k);elseprintf("%lld %lld\n", k, n - (k - 1) * (k - 1));}}return 0;}